繁体   English   中英

计算某些值的累积总和

[英]Calculate cumulative sums of certain values

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

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函数,但我失败了。

有任何想法吗?

谢谢!

你可以使用embed函数创建适当的滞后, rowSums加总,然后适当滞后(我用head )。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM