7

巨大なリスト (700 要素) があり、各要素は長さ = 16,000 のベクトルです。次の方法で、リストをデータフレームに変換する効率的な方法を探しています (これは単なるモック例です)。

lst <- list(a = c(1,2,3), b = c(4,5,6), c = c(7,8,9))

私が探している最終結果は次のとおりです。

 #  [,1] [,2] [,3]
 #a    1    2    3
 #b    4    5    6
 #c    7    8    9

これは私が試したものですが、私が望むように機能していません:

library(data.table)
result = rbindlist(Map(as.data.frame, lst))

なにか提案を?私の実際の例には大きな次元があることに注意してください。この操作を行うにはかなり効率的な方法が必要です。

どうもありがとうございました!

4

3 に答える 3

18

これを試して。Lすべてのコンポーネントが同じ長さ でnあると仮定し、行名もないと仮定します。

L <- list(a = 1:4, b = 4:1) # test input

n <- length(L[[1]])
DF <- structure(L, row.names = c(NA, -n), class = "data.frame")
于 2013-09-11T17:54:33.240 に答える
6

おもう

lst <- list(a = c(1,2,3), b = c(4,5,6), c = c(7,8,9))
do.call(rbind,lst)

動作します。より効率的な、卑劣な/危険な/コーナーカットの方法があるかどうかはわかりません。

あなたも試すことができます

m <- matrix(unlist(lst),byrow=TRUE,ncol=length(lst[[1]]))
rownames(m) <- names(lst)
as.data.frame(m)

……もしかして速い?

ステップの高速化については、あまりできない場合がありますas.data.frameas.data.frame.matrix可能な限り必要最小限にするために何を取り除くことができるかを見ると、おそらく重要なのは、列を独自の個々のリスト要素にコピーする必要があることです。

for (i in ic) value[[i]] <- as.vector(x[, i])

スピードアップできるかどうかを確認するためにストリップダウンas.data.frame.matrixを試すこともできますが、この操作がボトルネックであると推測しています。それを回避するには、データを行のリストから列のリストにマッピングするより高速な方法を見つける必要があります (おそらくRcpp解決策??)。

考慮すべきもう 1 つのことは、本当にデータ フレームが必要かどうかです。データが同種の型である場合は、結果を行列として保持できます。とにかく、ビッグデータの行列操作ははるかに高速です...

于 2013-09-11T17:42:05.583 に答える
3

どうt(as.data.frame(List))ですか?

> A = 1:16000
> List = list()
> for(i in 1:700) List[[i]] = A
> system.time(t(as.data.frame(List)))
   user  system elapsed 
   0.25    0.00    0.25 
于 2013-09-11T18:01:42.847 に答える