2016-08-14 1 views
0

私が持っていたRコードの古い部分を実行し、それをより効率的に傾動運動として実行しています。行列のi番目の行のすべての行をj回より効率的にR

私は、毎年(probMatrix)を表す366の行を持つ行列を持っています。 私は7つの行を持つ別のものを持っています。毎週の曜日(月曜日から)を表しています。これらの行列の両方に10個の列があります。

第2の行列には、各要素の最初の行列に(行単位で)乗算したい曜日のブール値が含まれています。

最後に、月曜日は2016年の4日目まで発生しなかったため、2番目の行列は正しい日数で乗算されるように4つ分オフセットする必要があります。 、

probMatrix <- matrix(rep((rep(1,366)), 10), ncol=10,byrow=TRUE) 
booleanMatrix <- matrix(rep(c(0,0,0,0,1), 14), ncol=10, byrow=FALSE) 

for (day in 1:7){ 
    actualDay <- (day+3) 
    dayIndex <- c(seq(actualDay,366,7)) 
    probMatrix[dayIndex,] <- sweep(probMatrix[dayIndex,],2, 
    as.numeric(booleanMatrix[day,]),"*") 
} 

を但し:

私はもともと毎日介して繰り返し処理を行い、週の最初の日に対応する第1のマトリックスの関連するインデックスを含むベクターを使用して、確率行列を掃引することをforループでした上記のように、これは非常に非効率的な方法です。私はこの種のコードがスクリプトを通してたくさん走っているので、少し速く動くものが欲しいです。

+1

[最小、再現可能な例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を共有できますか? – shayaa

+0

こんにちはshayaa、申し訳ありませんが、私は行列のセットアップの例を含めました。 – JamesHH

答えて

0

あなたは

rownames(booleanMatrix) <- 1:7 
rownames(probMatrix) <- c(rep(c(5,6,7,1,2,3,4), 52), 5, 6) 

に行名を設定した場合、あなたははるかに高速である必要があり

probMatrix <- probMatrix * booleanMatrix[rownames(probMatrix), ] 

を行うことができます。あるいは、変数にインデックスを保持し、その変数をインデックスとして使用します。

+0

ありがとうございます。これはまさに私が探していたものです。 – JamesHH

関連する問題