【发布时间】:2015-07-08 23:57:54
【问题描述】:
我正在尝试对矩阵进行以下求和:
假设矩阵是:
mat <- matrix(c(1:5,rep(0,7),c(1:7),rep(0,5),c(1:10), 0,0), 12,3)
我想分别对列号 1、2、3 的行号 5、7、10 的行进行累积求和。 (真实数据可以有任意数量的行和列)。
目前,我一直在使用以下代码:
sum1 <- matrix(rep(0, 36), 12, 3)
row_index <- c(5,7,10)
for (k in 1:3) {
sum1[1:row_index[k], k] <- cumsum(mat[1:row_index[k], k])
}
sum1 <- matrix(apply(sum1,1,sum))
首先,我有矩阵和 row_index。我想避免使用循环,因为数据有很多列。我想知道是否有办法做到这一点。
【问题讨论】:
-
直截了当:你在每一列上独立地做一个
cumsum,然后你rowsum跨越这些累积总和并平展结果? (最后的apply(sum1, 1, sum)- 你没有提到这个,但这就是你在做什么?) -
并且将列中的剩余值(您 不
cumsum超过,例如第 1 列中的索引 6:12)总是为 0,还是仅出于本示例的目的? -
如果@mathematical.coffee 说的是真的,你可以这样做:
rowSums(apply(replace(mat, mat==0, NA),2,cumsum),na.rm=TRUE) -
@mathematical.coffee 抱歉,我忘了在文中提及,但是是的,你没看错。我想在最后总结所有列。我没有
cumsum的所有索引理想情况下应该为零,但它们可能是负数,在这种情况下需要过滤。所以我喜欢@thelatemail 的方法,因为它允许我在给定任何条件的情况下替换所有元素。谢谢你们!