unlist()がRの日付を強制終了するのはなぜですか


84

日付のリストをリストから外すと、数値に戻ります。それは正常ですか?as.Dateを再適用する以外の回避策はありますか?

> dd <- as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))
> class(dd)
[1] "Date"
> unlist(dd)
[1] "2013-01-01" "2013-02-01" "2013-03-01"
> list(dd)
[[1]]
[1] "2013-01-01" "2013-02-01" "2013-03-01"

> unlist(list(dd))
[1] 15706 15737 15765

これはバグですか?


2
From ?unlist可能な場合、リスト要素はリスト解除中にコモンモードに強制変換されるため、結果は文字ベクトルとして終わることがよくあります。ベクトルは、階層内のコンポーネントの最上位タイプに強制変換されますNULL <生<論理<整数<実数<複合<文字<リスト<式:ペアリストはリストとして扱われます。
アルン2013年

6
うん、私はマニュアルを読んだ....彼らはすでに共通モードになっている
Thomas Browne 2013年

1
私はその行動が正常ではないことに同意します。ただし、使用している関数のドキュメントを読むことを常にお勧めします。
アルン2013年

7
@Arunなぜそれが関係するのかわかりません。日付ベクトルは内部的に整数であるため、問題は実際には属性が削除されることです。ドキュメントにはこれが明示的に記載されていませんが、リストから外すと一般に属性を保持できる方法はありません。
ハドリー2013年

1
@Arunはい、unlistリスト以外の入力を変更せずに返すためです。私にはまったくぼやけていないように見えますが、ドキュメントには属性に何が起こるかを記載する必要があります。
ハドリー2013年

回答:


94

do.callリストを使って「何かをする」ための便利な関数です。この場合、を使用して連結しcます。それはに珍しいことではありませんcbindか、rbind単一の大きなdata.frameにリストからdata.frames。

ここで行っているのは、実際にはddリストの要素を連結することです。これはに類似していc(dd[[1]], dd[[2]])ます。c関数または文字として提供できることに注意してください。

> dd <- list(dd, dd)
> (d <- do.call("c", dd))
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-01-01" "2013-02-01" "2013-03-01"
> class(d) # proof that class is still Date
[1] "Date"

7
この答えは、あなたがしていることを説明するもう少し詳細を追加できれば大幅に改善されるので、他の人は後でそれをより読みやすくするでしょう。
Dinre 2013年


3
@AlessandroJacopson引用符は必要ありませんが(のヘルプファイルを参照do.call)、引用符で囲む必要のある関数(例:)に便利な場合がありますdo.call("+", as.list(c(1, 1)))
ローマLuštrik

1
別の素敵なアプローチをしてベクトルにリストからの変換を実行することであるReduce、すなわち、 Reduce("c",dd)
オリオール・プラット

2
コードをありがとう。質問に答えません、tho:なぜ殺害日をリストから外すのですか?
dfrankow

0

または、purrrを使用して、日付のリストをベクトル保存タイプにフラット化します。

list(as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))) %>% purrr::reduce(c)

結果は

[1] "2013-01-01" "2013-02-01" "2013-03-01"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.