如何在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))
lapply
将do.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)