在R

时间:2016-08-14 22:09:22

标签: r performance loops matrix

我正在浏览一段旧的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 个答案:

答案 0 :(得分: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), ]

应该快得多。或者将索引保存在变量中,并将该变量用作索引。

相关问题