我有一个长度为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))
}
答案 0 :(得分:120)
这应该等同于您当前的代码,速度要快得多:
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
答案 1 :(得分:15)
我认为你想要
output <- do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE))
即。将@ 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
如果它适当缩放(即你没有遇到内存问题),完全问题在同类机器上需要大约130 * 0.2秒= 26秒(我在2岁的MacBook Pro上做了这个)
答案 2 :(得分:5)
有关输出的示例信息会很有帮助。在更大更大的事情上递归使用rbind
不推荐。我首先想到的东西可以帮到你:
z <- list(1:3,4:6,7:9)
do.call(rbind,z)
如果需要,请参阅a related question以获得更高的效率。
答案 3 :(得分:0)
您也可以使用
output <- as.matrix(as.data.frame(z))
内存使用情况与
非常相似output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
可以使用mem_changed()
中的library(pryr)
进行验证。
答案 4 :(得分:-5)
您可以使用as.matrix,如下所示:
output <- as.matrix(z)