use*_*675 58 performance r list matrix
我有一个长度为130,000的列表,其中每个元素是一个长度为110的字符向量.我想将此列表转换为维度为1,430,000*10的矩阵.我怎样才能更有效地做到这一点?\我的代码是:
output=NULL
for(i in 1:length(z)) {
output=rbind(output,
matrix(z[[i]],ncol=10,byrow=TRUE))
}
Run Code Online (Sandbox Code Playgroud)
flo*_*del 122
这应该等同于您当前的代码,速度要快得多:
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
Run Code Online (Sandbox Code Playgroud)
Ben*_*ker 15
我想你想要的
output <- do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE))
Run Code Online (Sandbox Code Playgroud)
即将@ BlueMagister的使用do.call(rbind,...)与一个lapply语句相结合,将单个列表元素转换为11*10矩阵......
基准测试(显示@ flodel的unlist解决方案比我的快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
Run Code Online (Sandbox Code Playgroud)
如果这适当地扩展(即你没有遇到内存问题),完全问题将花费大约130*0.2秒= 26秒在同类机器上(我在2岁的MacBook Pro上做到这一点).
获取有关输出的示例信息会很有帮助.不建议递归使用rbind越来越大的东西.我首先想到的东西会对你有所帮助:
z <- list(1:3,4:6,7:9)
do.call(rbind,z)
Run Code Online (Sandbox Code Playgroud)
如果需要,请参阅相关问题以提高效率.