2017-06-14 10 views
1

行列を作成しようとしていますが、各行は別の行列の3行ごとの合計で構成されています。実際にリストにはこれらの行列の束があり、そのリスト内の各要素に対して同じ操作を実行しています。このpostに基づいて、以下のコードを生成することができました。それは動作しますが、私のより複雑なデータセットは永遠に必要です。リスト内の行列のn行ごとの合計

test<-lapply(1:1000, function(x) matrix(1:300, nrow=60)) 
testCons<-lapply(test, function(x) apply(x, 2, function(y) tapply(y, ceiling(seq_along(y)/3), sum))) 

誰かがそれをスピードアップする方法やそれを簡素化する方法を知っていますか?

答えて

4

rowsumは、3行ごとのインデックスであるグループ化変数に従って行の合計を計算します。

test <- lapply(1:1000, function(x) matrix(1:300, nrow=60)) 

system.time(
    testCons <- lapply(test, function(x) apply(x, 2, function(y) tapply(y, ceiling(seq_along(y)/3), sum))) 
) 
# user system elapsed 
# 1.672 0.004 1.678 

system.time(
    testCons2 <- lapply(test, function(x) rowsum(x, rep(seq_len(nrow(x)/3), each=3))) 
) 
# user system elapsed 
# 0.08 0.00 0.08 

all.equal(testCons, testCons2) 
#[1] TRUE 
+1

はい、これは高速です。ありがとうございました! – user3390169

関連する問題