【问题标题】:Date difference within groups based on condition基于条件的组内日期差异
【发布时间】:2017-11-23 20:13:18
【问题描述】:

我有以下数据。 df 是我的起点。 df2 是我想要实现的目标。

df

    "ID"    "event" "time"       "group"  
    1        FALSE   1990-01-01   1
    2        FALSE   1990-01-02   1
    3        FALSE   1990-01-03   1
    4        TRUE    1990-01-04   1
    5        FALSE   1990-01-02   2
    6        TRUE    1990-01-03   2
    7        FALSE   1990-01-03   3

df2(我需要的)

    "ID"    "event" "time"       "group"  distance
    1        FALSE   1990-01-01   1       3
    2        FALSE   1990-01-02   1       2
    3        FALSE   1990-01-03   1       1 
    4        TRUE    1990-01-04   1       0 
    5        FALSE   1990-01-02   2       1
    6        TRUE    1990-01-03   2       0
    7        FALSE   1990-01-03   3       NA

我需要组内任何观察与满足 event=TRUE 条件的观察之间的日期差异(距离列)。如果组中没有发生任何事件,则应使用 NA 代替距离指示符。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    您可以首先获取一个数据框,其中包含df 中具有df$event = TRUE 的那些行。然后将该较小的数据框与df 合并以获得更大的merged_df,附加列merged_df$time.y 告诉您该组最后一次出现event=TRUE 的日期:

    merged_df <- merge(x = df, y = df[df$event == TRUE, ], 
                      by = "group", all.x = TRUE)
    df$distance <- ( merged_df$time.y - df$time )
    df
    #  ID event       time group distance
    #1  1 FALSE 1990-01-01     1   3 days
    #2  2 FALSE 1990-01-02     1   2 days
    #3  3 FALSE 1990-01-03     1   1 days
    #4  4  TRUE 1990-01-04     1   0 days
    #5  5 FALSE 1990-01-02     2   1 days
    #6  6  TRUE 1990-01-03     2   0 days
    #7  7 FALSE 1990-01-03     3  NA days
    

    数据:

    df <- structure(list(ID = 1:7, event = c(FALSE, FALSE, FALSE, TRUE, 
               FALSE, TRUE, FALSE), time = structure(c(7305, 7306, 7307, 7308, 
               7306, 7307, 7307), class = "Date"), group = c(1L, 1L, 1L, 1L, 
               2L, 2L, 3L)), .Names = c("ID", "event", "time", "group"), row.names = c(NA, 
               -7L), class = "data.frame")
    

    【讨论】:

    • 仅供参考,( merge_df$time.y - df$time ) 中的小错字;应该是( merged_df$time.y - df$time )
    • 首先:非常感谢您的解决方案!我在真实数据集中生成的 merge_df 的大小增加了,我无法解释自己的原因。您对我如何防止这种情况发生有任何提示吗?
    • 我猜这是由于一组中的多个事件=TRUE。你知道在不删除它提供的信息的情况下捕获第二个事件的一些干净的方法吗?假设 n 距离列。
    • 我不了解您的应用程序,因此我无法判断哪种方案是您的最佳解决方案。我认为你的建议需要一种非常不同的方法,我不能轻易地建立在我的答案之上。会不会是一组多个TRUE表示数据不干净?另一种处理方法是只保留最新日期的event=TRUE。您仍然只会得到一个距离列并忽略所有“过早”event=TRUE 行..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-12-02
    相关资源
    最近更新 更多