我需要进行超过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循环是解决方案,但我无法让它工作.
如果你有很大的阵列可以使用,你可能最好坚持使用基础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自动为结果保留了内存,并且结果[<-是缓慢的事实.
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |