【问题标题】:R - Calculate Observations Elapsed Since Last Event with Multiple Event Types and IDsR - 使用多个事件类型和 ID 计算自上次事件以来经过的观察
【发布时间】:2020-03-24 13:00:10
【问题描述】:

我想知道如何计算自同一类型事件以来的观察次数,以及如何计算自任何其他类型事件以来的观察次数。我的数据表中也有 id。

为了说明,请参见下文。我正在尝试使用 Datatables 在 R 中执行此操作,但收效甚微。

我有一个如下的数据表:

  date     event  id
2000-07-06     2  1
2000-07-07     1  1
2000-07-09     0  1
2000-07-10     0  1
2000-07-15     2  1
2000-07-16     1  1
2000-07-20     0  1
2000-07-21     1  1
2000-07-06     1  2
2000-07-07     2  2
2000-07-15     0  2
2000-07-16     0  2
2000-07-17     2  2
2000-07-18     1  2

而我想要的是这样的:

  date     event  id obs_since_event_1 obs_since_event_2
2000-07-06     2  1        NA                 NA
2000-07-07     1  1        NA                 1
2000-07-09     0  1        1                  2
2000-07-10     0  1        2                  3
2000-07-15     2  1        3                  4
2000-07-16     1  1        4                  1
2000-07-20     0  1        1                  2
2000-07-21     1  1        2                  3
2000-07-06     1  2        NA                 NA
2000-07-07     2  2        1                  NA
2000-07-15     0  2        2                  1
2000-07-16     0  2        3                  2
2000-07-17     2  2        4                  3
2000-07-18     1  2        5                  1

这两个事件是互斥的,即它们不能发生在同一观察日。希望听到一些好的建议。一切顺利。

【问题讨论】:

    标签: r datatable


    【解决方案1】:

    这是一种使用dplyr 和非标准评估的方法:

    library(dplyr)
    
    apply_fun <- function(df, value) {
    
      col <- paste0('obs_since_event_', value)
      df %>%
        group_by(id) %>%
        group_by(temp = lag(cumsum(event == value), default = 0), add = TRUE) %>%
        mutate(!!col := row_number()) %>%
        ungroup() %>%
        mutate(!!col := replace(!!sym(col), temp == 0, NA))  %>%
        select(-temp)
    }
    
    df <- apply_fun(df, 1)
    df <- apply_fun(df, 2)
    
    df
    
    # A tibble: 14 x 5
    #   date       event    id obs_since_event_1 obs_since_event_2
    #   <fct>      <int> <int>             <int>             <int>
    # 1 2000-07-06     2     1                NA                NA
    # 2 2000-07-07     1     1                NA                 1
    # 3 2000-07-09     0     1                 1                 2
    # 4 2000-07-10     0     1                 2                 3
    # 5 2000-07-15     2     1                 3                 4
    # 6 2000-07-16     1     1                 4                 1
    # 7 2000-07-20     0     1                 1                 2
    # 8 2000-07-21     1     1                 2                 3
    # 9 2000-07-06     1     2                NA                NA
    #10 2000-07-07     2     2                 1                NA
    #11 2000-07-15     0     2                 2                 1
    #12 2000-07-16     0     2                 3                 2
    #13 2000-07-17     2     2                 4                 3
    #14 2000-07-18     1     2                 5                 1
    

    【讨论】:

    • 嗨罗纳克!这显然行不通。运行代码时,计数器不会重置。它只是向上计数
    • @Rnovice 我不确定可能出了什么问题。它适用于您提供的示例数据,因此我无法验证您在说什么。
    猜你喜欢
    • 1970-01-01
    • 2015-12-19
    • 2014-12-20
    • 2015-08-04
    • 2017-10-26
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多