【问题标题】:Sum previous instances that match the same ID [duplicate]总结与相同ID匹配的先前实例[重复]
【发布时间】:2018-11-16 19:14:45
【问题描述】:

我有这个示例数据集:

    df <- data.frame(ID = c(1, 1, 1, 2, 2, 2), A = c("2018-10-12",
          "2018-10-12", "2018-10-13", "2018-10-14", "2018-10-15", "2018-10-16"), 
          B = c(1, 5, 7, 2, 54, 202))
  ID       A      B
1  1 2018-10-12   1
2  1 2018-10-12   5
3  1 2018-10-13   7
4  2 2018-10-14   2
5  2 2018-10-15  54
6  2 2018-10-16 202

我要做的是创建一个列 C,它是 B 的总和,但仅适用于每一行之前的日期。例如,我正在寻找的输出是:

  ID       A      B   C
1  1 2018-10-12   1   1
2  1 2018-10-12   5   6
3  1 2018-10-13   7   13
4  2 2018-10-14   2   2
5  2 2018-10-15  54   56
6  2 2018-10-16 202   258

当我有这些问题时,我通常会使用子集来做单独的 sumif,但我不确定如何在新专栏中做到这一点。

我的最终目标是确定每个 ID(如果适用)超过 50 的日期。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以通过累积和进行分组来创建“C”列

    library(dplyr)
    df %>% 
      group_by(ID) %>% 
      mutate(C = cumsum(B))
    

    或使用data.table

    library(data.table)
    setDT(df)[, C := cumsum(B), by = ID]
    

    base R

    df$C <- with(df, ave(B, ID, FUN = cumsum))
    

    【讨论】:

    • 谢谢!这似乎有效。我使用了基本 R 方法,但似乎我需要按投资日期对数据进行排序才能正常工作,对吧?
    • @deslaur 您可以先通过investmentdate 订购,然后在ordered 数据上应用cumsum
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多