2009-10-03 8 views
8

次のコードを取る:result[,'a']リストを示し、この場合、正則行列にリストの行列を変換

foo <- list() 
foo[[1]] <- list(a=1, b=2) 
foo[[2]] <- list(a=11, b=22) 
foo[[3]] <- list(a=111, b=222) 
result <- do.call(rbind, foo) 
result[,'a'] 

を。 resultがベクトルの「通常の」マトリックスであるようなよりエレガントな方法はありますか?私はこれについて手作業で行くことを想像していますが、私が欠けていた明らかなステップがあるかどうか疑問に思っていました。以下の(しかし、代替案に興味を持っています)として

答えて

9

do.callは非常にエレガントで、かつ高速です。実際にdo.call(rbind、my.list)は、巨大なリストを結合する必要があるときに私のお尻を保存しました。これははるかに速い解決策でした。私は `do.call` +` rbind`が速かった希望

do.call(rbind, lapply(foo, unlist)) 


> result.2 <- do.call(rbind, lapply(foo, unlist)) 
> result.2 
     a b 
[1,] 1 2 
[2,] 11 22 
[3,] 111 222 
> result.2[, 'a'] 
[1] 1 11 111 
> 
+1

多分何かのように、あなたの問題を解決するために。リストに10,000のデータフレームを使ってみたことがありますか? – hadley

+0

@hadley:計算統計クラスでは、リストをバインドするのに(これは他の多くの試みが失敗した後の)最も速い方法だったことを覚えているようです。多分私は間違ったことを覚えています。早いのは何ですか? – Vince

+2

自分で慎重に書き込むと、約4倍高速に管理できます。 plyrの次のリリースで 'rbind.fill'が私の最新の最善の努力を取り入れます。 – hadley

1

一つの可能​​な解決策は、次のとおりです。リストの

new.result <- matrix(unlist(result), ncol=ncol(result), 
       dimnames=list(NULL, colnames(result))) 
関連する問題