计算某些值的累积总和

时间:2011-10-19 13:57:24

标签: r

假设您有一个这样的数据框:

df <- data.frame(Nums = c(1,2,3,4,5,6,7,8,9,10), Cum.sums = NA)
> df
   Nums Cum.sums
1     1       NA
2     2       NA
3     3       NA
4     4       NA
5     5       NA
6     6       NA
7     7       NA
8     8       NA
9     9       NA
10   10       NA

你需要这样的输出:

   Nums Cum.sums
1     1        0
2     2        0
3     3        0
4     4        3
5     5        5
6     6        7
7     7        9
8     8       11
9     9       13
10   10       15

Cum.sum列的4.元素是1和2的总和,Column Cum.sum的5.元素是2和3的总和,依此类推...... 这意味着,我想构建第一行的累积和,并将其保存在第二行。但是我不想要正常的累计和,而是当前行上方的元素2行加上当前行上方3行的元素之和。

我已经尝试过使用sum和cumsum函数,但我失败了。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用embed函数创建适当的滞后,rowSums求和,然后适当滞后(我使用head)。

df$Cum.sums[-(1:3)] <- head(rowSums(embed(df$Nums,2)),-2)

答案 1 :(得分:0)

您不需要任何特殊功能,只需使用法向量操作(这些解决方案都是等效的):

df$Cum.sums[-(1:3)] <- head(df$Nums, -3) + head(df$Nums[-1], -2)

with(df, Cum.sums[-(1:3)] <- head(Nums, -3) + head(Nums[-1], -2))

df$Cum.sums[-(1:3)] <- df$Nums[1:(nrow(df)-3)] + df$Nums[2:(nrow(df)-2)]

我相信前三个总和应该是NA,而不是0,但是如果你喜欢零,你可以先将这些总和初始化:

df$Cum.sums <- 0

答案 2 :(得分:0)

另一种解决方案,优雅而通用,使用矩阵乘法 - 对大数据非常低效。所以它不太实用,虽然是一个很好的练习:

len <- nrow(df)
sr <- 2 # number of rows to sum
lag <- 3 
mat <- matrix(
           head(c(
                 rep(0, lag * len), 
                 rep(rep(1:0, c(sr, len - sr + 1)), len)
               ), len * len), 
           nrow = 10, byrow = TRUE
       )
mat %*% df$Nums