【问题标题】:Calculate cumulative sums of certain values计算某些值的累积总和
【发布时间】:2011-10-19 13:57:23
【问题描述】:

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

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 的和,Cum.sum 列的第 5 个元素是 2 和 3 的和等等... 这意味着,我想建立第一行的累积总和并将其保存在第二行。但是我不想要正常的累积总和,而是当前行上方 2 行的元素加上当前行上方 3 行的元素的总和。

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

有什么想法吗?

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

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

    df$Cum.sums[-(1:3)] <- head(rowSums(embed(df$Nums,2)),-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)]
      

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

      df$Cum.sums <- 0
      

      【讨论】:

      • 虽然这是针对这个特定问题的有效解决方案,但它不能很好地概括(例如,如果累积总和超过 20 行而不是 2 行)。
      • @Joshua,你说得对,我发布了更通用的解决方案,但不是很实用。您的解决方案可能是最好的。
      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2018-07-21
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 2015-09-07
        • 2018-04-09
        • 2019-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多