如何在R中更有效地将列表转换为matrix?

我有一个长度为130,000的列表,其中每个元素是长度为110的字符向量。我想将此列表转换为维度为1,430,000 * 10的matrix。 我怎样才能更有效地做到这一点? 我的代码是:

output=NULL for(i in 1:length(z)) output=rbind(output,matrix(z[[i]],ncol=10,byrow=T)) 

这应该相当于你现在的代码,只是快了很多:

 output <- matrix(unlist(z), ncol = 10, byrow = TRUE) 

你想要

 output <- do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE)) 

lapplydo.call(rbind,...)lapply语句结合使用,将单个列表元素转换为11 * 10matrix。

基准(显示@ flodel的未unlist解决scheme比我的速度快5倍,比原始方法快230倍)

 n <- 1000 z <- replicate(n,matrix(1:110,ncol=10,byrow=TRUE),simplify=FALSE) library(rbenchmark) origfn <- function(z) { output <- NULL for(i in 1:length(z)) output<- rbind(output,matrix(z[[i]],ncol=10,byrow=TRUE)) } rbindfn <- function(z) do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE)) unlistfn <- function(z) matrix(unlist(z), ncol = 10, byrow = TRUE) ## test replications elapsed relative user.self sys.self ## 1 origfn(z) 100 36.467 230.804 34.834 1.540 ## 2 rbindfn(z) 100 0.713 4.513 0.708 0.012 ## 3 unlistfn(z) 100 0.158 1.000 0.144 0.008 

如果这个比例适当的话(即你没有遇到内存问题),在一台类似的机器上(我在一台2岁的MacBook Pro上这样做),完整的问题将花费大约130 * 0.2秒= 26秒。

这将有助于获得有关您的输出的示例信息。 不推荐recursion地使用rbind更大更大的事情。 我的第一个猜测是可以帮助你的东西:

 z <- list(1:3,4:6,7:9) do.call(rbind,z) 

如有需要,请参阅相关问题以获得更高的效率。

你可以使用as.matrix如下:

 output <- as.matrix(z)