必须加快逐行操作

Chr*_*ris 4 r

我需要进行超过1500万次的行操作,但代码太慢.这是一个可重复的小例子:

costMatrix1 <- rbind(c(4.2,3.6,2.1,2.3),c(9.6,5.5,7.2,4.9),c(2.6,8.2,6.4,8.3),c(4.8,3.3,6.8,5.7))
costMatrix2 <- costMatrix1 #Example, the costMatrix2 is actually different from costMatrix1

tbl_Filter <- rbind(c(0,0,0,4),c(1,2,3,4),c(1,0,3,0),c(1,2,0,0),c(1,2,0,4))

tbl_Sums <- data.frame(matrix(0, nrow=10, ncol=2))
colnames(tbl_Sums) <- c("Sum1","Sum2")

for (i in 1:nrow(tbl_Filter))
{
  tbl_Sums[i,1] <- sum(costMatrix1[tbl_Filter[i,],tbl_Filter[i,]])
  tbl_Sums[i,2] <- sum(costMatrix2[tbl_Filter[i,],tbl_Filter[i,]])
}
Run Code Online (Sandbox Code Playgroud)

我认为用ddply替换for循环是解决方案,但我无法让它工作.

And*_*rie 5

如果你有很大的阵列可以使用,你可能最好坚持使用基础R.

以下是如何使用sapply单一矩阵求解求和问题的方法.然后在每个输入矩阵上重复使用它:

sumOne <- function(cost, filter){
  sapply(1:nrow(filter), function(i)sum(cost[filter[i,], filter[i,]]))
}


cbind(
    sumOne(costMatrix1, tbl_Filter),
    sumOne(costMatrix2, tbl_Filter)
)
Run Code Online (Sandbox Code Playgroud)

结果:

     [,1]  [,2]
[1,]  5.7  11.4
[2,] 85.5 171.0
[3,] 15.3  30.6
[4,] 22.9  45.8
[5,] 43.9  87.8
Run Code Online (Sandbox Code Playgroud)

这应该比你的循环快得多.不是因为for循环本身比sapply慢(事实并非如此),而是因为sapply自动为结果保留了内存,并且结果[<-是缓慢的事实.