私は明らかに単純な問題を抱えており、開発したものよりも高速なR実装が必要です。
この例では、ランダムシードとディメンションを初期化します。
set.seed(1)
d1<-400
d2<-20000
d3<-50
私は寸法と、行列Xを有するD1 X D2:
X<-as.data.frame(matrix(rnorm(d1*d2),nrow=d1,ncol=d2))
rownames(X)<-paste0("row",1:nrow(X))
colnames(X)<-paste0("col",1:ncol(X))
そして、d1行インデックスを持つベクトルu :
u<-sample(rownames(X),nrow(X),replace=TRUE)
私は、また、名前、行および寸法を有する行列C有するD3 X d2は:
C<-matrix(rnorm(d3*d2),nrow=d3,ncol=d2)
rownames(C)<-sample(rownames(X),nrow(C),replace=FALSE)
ここで、次の非常に遅いループを使用して、一致するX行の合計で行列Cを埋めています。
system.time(
for(i in 1:nrow(C)){
indexes<-which(u==rownames(C)[i])
C[i,] <- colSums(X[indexes,])
}
)
この操作は私のPCでは約11.5秒かかりますが、forループを回避することで高速化できると確信しています。何か案は?どうもありがとう!
matrixStats::colSums2
行インデックスを渡しrownames()
、ループの外に移動するオプションと一緒に使用するだけです(X
行列に変換する必要があります)。
Xm <- as.matrix(X)
names_of_rows <- rownames(C)
system.time(for (i in 1:nrow(C)) {
indexes <- which(u == names_of_rows[i])
C[i, ] <- matrixStats::colSums2(Xm, rows = indexes)
})
# 0.03 sek
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加