我有一个长度为 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))
}
我有一个长度为 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))
}
这应该等同于您当前的代码,只是要快得多:
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
我想你想要
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 上做了这个)。
获取有关您的输出的示例信息会有所帮助。不推荐递归地使用rbind
越来越大的东西。我的第一个猜测可以帮助你:
z <- list(1:3,4:6,7:9)
do.call(rbind,z)
如果需要,请参阅相关问题以提高效率。
你也可以使用,
output <- as.matrix(as.data.frame(z))
内存使用情况非常相似
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
mem_changed()
可以使用from进行验证library(pryr)
。
您可以使用 as.matrix 如下:
output <- as.matrix(z)