【问题标题】:How to perform a cumulative sum with unique IDs only?如何仅使用唯一 ID 执行累积和?
【发布时间】:2017-12-13 17:52:58
【问题描述】:

我有以下数据框:

d<-data.frame(Day=c(1, 1, 1, 1, 1, 1, 2), ID=c("A", "B", "C", "D", "A", "B", "B"), Value=c(1, 2, 3, 4, 5, 6, 7))

每天,我都想要一个唯一值的累积总和,对于重复的条目只取最近的值。我的预期输出如下:

d<-data.frame(Day=c(1, 1, 1, 1, 1, 1, 2), ID=c("A", "B", "C", "D", "A", "B", "B"), Value=c(1, 2, 3, 4, 5, 6, 7), Sum=c(1, 3, 6, 10, 14, 18, 7))

  Day ID Value Sum
1   1  A     1   1
2   1  B     2   3
3   1  C     3   6
4   1  D     4  10
5   1  A     5  14
6   1  B     6  18
7   2  B     7   7

第 5 个条目将值 2、3、4、5 相加(因为 A 重复),第 6 个条目将值 3、4、5 和 6 相加(因为 A 和 B 都重复)。第 7 个条目重新开始,因为它是新的一天。

我认为我不能使用 cumsum() 因为它只接受 1 个参数。我也不想为每个 ID 保留一个计数器,因为我每天可能有多达 100 个唯一 ID。

任何提示或帮助将不胜感激!谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以通过 ID 和 Day 来区分这些值,然后使用 cumsum

    library(data.table)
    setDT(d)
    d[, v_eff := Value - shift(Value, fill=0), by=.(Day, ID)]
    d[, s := cumsum(v_eff), by=Day]
    
       Day ID Value Sum v_eff  s
    1:   1  A     1   1     1  1
    2:   1  B     2   3     2  3
    3:   1  C     3   6     3  6
    4:   1  D     4  10     4 10
    5:   1  A     5  14     4 14
    6:   1  B     6  18     4 18
    7:   2  B     7   7     7  7
    

    Base R 类似物...

    d$v_eff <- with(d, ave(Value, Day, ID, FUN = function(x) c(x[1], diff(x)) ))
    d$s <- with(d, ave(v_eff, Day, FUN = cumsum))
    
      Day ID Value Sum v_eff  s
    1   1  A     1   1     1  1
    2   1  B     2   3     2  3
    3   1  C     3   6     3  6
    4   1  D     4  10     4 10
    5   1  A     5  14     4 14
    6   1  B     6  18     4 18
    7   2  B     7   7     7  7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2011-03-07
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      相关资源
      最近更新 更多