【问题标题】:cumulative days passed since reoccurring event by group自组重复事件以来经过的累计天数
【发布时间】:2017-12-13 06:08:04
【问题描述】:

我想计算自event==1 以来经过的累计天数。是否可以在 R 中使用 data.table 执行此操作?

期望的结果:

    id       date event passed
 1:  A 2000-01-13     1      0
 2:  A 2000-01-18     0      5
 3:  A 2000-01-25     0     12
 4:  A 2000-01-31     1      0
 5:  B 2012-10-10     1      0
 6:  B 2012-10-11     0      1
 7:  B 2012-10-14     1      0
 8:  B 2012-10-15     0      1
 9:  C 2005-07-25     1      0
10:  C 2005-07-31     0      6

df <- data.table(
  id    = c("A", "A", "A", "A", 
            "B", "B", "B", "B", 
            "C", "C"), 
  date  = c("2000-01-13", "2000-01-18", "2000-01-25", "2000-01-31", # A
            "2012-10-10", "2012-10-11", "2012-10-14", "2012-10-15", # B
            "2005-07-25", "2005-07-31"),                            # C
  event = c(1, 0, 0, 0,
            0, 0, 1, 0,
            1, 0)
    )

编辑(2017 年 12 月 12 日):尝试使用 @Psidom 的解决方案。

解决方案需要对iddate 进行排序,这不是问题。但是请注意,第 6 行:计数一天,尽管这应该是 0,因为该组尚未发生任何事件。

df2 <- df[sample(nrow(df)),]
df2 = df2[order(id, date)]
df2[, days_from_start := cumsum(c(0, diff(as.Date(date)))), by = .(id, cumsum(event))]

    id       date event days_from_start
 1:  A 2000-01-13     1               0
 2:  A 2000-01-18     0               5
 3:  A 2000-01-25     0              12
 4:  A 2000-01-31     0              18
 5:  B 2012-10-10     0               0
 6:  B 2012-10-11     0               1
 7:  B 2012-10-14     1               0
 8:  B 2012-10-15     0               1
 9:  C 2005-07-25     1               0
10:  C 2005-07-31     0               6

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    如果event 列仅包含01,您可以通过执行cumsum(event) 创建一个组变量,只要event1 就会创建一个新组;然后按这个新变量分组,计算累计天数:

    df[, days_from_start := cumsum(c(0, diff(as.Date(date)))), by = cumsum(event)]
    #                                                               ^^^^^^^^^^^^^
    df
    #    id       date event days_from_start
    # 1:  A 2000-01-13     1               0
    # 2:  A 2000-01-18     0               5
    # 3:  A 2000-01-25     0              12
    # 4:  A 2000-01-31     1               0
    # 5:  B 2012-10-10     1               0
    # 6:  B 2012-10-11     0               1
    # 7:  B 2012-10-14     1               0
    # 8:  B 2012-10-15     0               1
    # 9:  C 2005-07-25     1               0
    #10:  C 2005-07-31     0               6
    

    【讨论】:

    • 有没有办法将它也作为我的组(id)进行子集化。事实证明,累计数字将继续跨组计算。
    • 您可以将 id 添加到 group 变量中。 ‘by = .(id, cumsum(event))’
    • 似乎你可以做类似date - first(date) 的事情而不是cumsum。当然,OP 应该只用 Date/IDate-class 列覆盖日期,而不是按组临时解析它。另外,我猜你希望在每个 id 的第一个事件之前有 NA(或者 OP 说为零)。
    猜你喜欢
    • 2019-06-06
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2021-08-27
    相关资源
    最近更新 更多