2016-08-14 33 views
0

我正在運行一段舊的R代碼,並使它作爲一項傾斜練習更有效地運行。循環通過矩陣的每第i行j在R中更有效率

我有一個有366行的矩陣,代表一年中的每一天(probMatrix)。 我有另一個有7行,代表一週中的每一天(從星期一開始)。這兩個矩陣都有10列。

第二個矩陣包含一週中每天的布爾值,我想通過相關元素的第一個矩陣(按行)進行乘法。

最後,因爲星期一直到2016年的第四天才會發生,所以第二個矩陣需要抵消四,以便它乘以正確的天數。

我本來一個for循環,通過每天進行迭代,並且掃過使用含有對應於一周的第一天的第一矩陣的相關索引的向量的概率矩陣:

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

你能分享一個[最小,可重現的例子](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

相關問題