2009-10-03 116 views
8

採取以下代碼:轉換列表的矩陣到正規矩陣

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[,'a']列表。有沒有更優雅的方式使result是一個「常規」向量矩陣?我想有一些手動方法可以解決這個問題,但我想知道是否有一個明顯的步驟,我錯過了。

回答

9

do.call上列出很優雅,和快速。事實上,當我需要組合一個巨大的列表時,do.call(rbind,my.list)曾經挽救了我的屁股。這是迄今爲止最快的解決方案。

解決您的問題,也許是這樣的:

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

我想'do.call' +'rbind'爲快。你有沒有試過在列表中使用10000個數據幀? – hadley 2009-10-04 01:22:22

+0

@hadley:我似乎記得在計算統計類中學習這是綁定列表的最快方式(在許多其他失敗嘗試之後)。也許我記得錯誤的東西。什麼更快? – Vince 2009-10-04 02:09:24

+2

如果你自己仔細寫下,你可以快4倍。下一個plyr版本中的'rbind.fill'將包含我最新的最佳努力。 – hadley 2009-10-04 14:05:56

1

一個可能的解決方案如下(但我感興趣的備選方案):

new.result <- matrix(unlist(result), ncol=ncol(result), 
       dimnames=list(NULL, colnames(result)))