66

長さ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))
}
4

5 に答える 5

143

これは現在のコードと同等である必要がありますが、はるかに高速です。

output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
于 2012-11-05T01:08:47.120 に答える
16

私はあなたが欲しいと思います

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でこれを行いました)。

于 2012-11-05T01:05:18.353 に答える
7

出力に関するサンプル情報があると役立ちます。rbindますます大きなものを再帰的に使用することはお勧めしません。あなたを助ける何かについての私の最初の推測:

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

必要に応じて、効率を高めるために関連する質問を参照してください。

于 2012-11-05T00:50:00.600 に答える
3

また、使用することができます、

output <- as.matrix(as.data.frame(z))

メモリ使用量は非常に似ています

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

mem_changed()からで確認できますlibrary(pryr)

于 2018-12-04T16:13:32.157 に答える
-5

以下のようにas.matrixを使用できます。

output <- as.matrix(z)
于 2016-09-14T07:39:42.577 に答える