【问题标题】:counting consecutive dates R计算连续日期 R
【发布时间】:2021-12-29 20:15:27
【问题描述】:

如何在列中检查日期是否彼此不同

【问题讨论】:

    标签: r date time lag lead


    【解决方案1】:

    使用tidyverse,您可以同时使用group_byid 以及第二个ID id2,它将以一天的差值分隔的行组合在一起。然后,连续天数列将包括 last 日期和 first date 之间的差异(如果不是 first date,则为零)。

    library(tidyverse)
    
    data %>%
      mutate(date = as.Date(date, format = "%m-%d-%Y")) %>%
      arrange(id, date) %>%
      group_by(id) %>%
      group_by(id2 = cumsum(c(T, diff(date) > 1)), .add = T) %>%
      mutate(num_con_days = ifelse(date == first(date), last(date) - date + 1, 0)) %>%
      ungroup %>%
      select(-id2)
    

    输出

         day    id date       num_con_days
       <dbl> <dbl> <date>            <dbl>
     1     1    10 2021-01-01            1
     2     3    10 2021-01-03            4
     3     4    10 2021-01-04            0
     4     5    10 2021-01-05            0
     5     6    10 2021-01-06            0
     6     1    24 2021-01-01            2
     7     2    24 2021-01-02            0
     8     4    24 2021-01-04            3
     9     5    24 2021-01-05            0
    10     6    24 2021-01-06            0
    

    编辑:使用您的另一个示例,使用重命名的列名,您有以下 data.frame:

       id        day num_consecutive_days
    1   1 2021-01-02                    1
    2   2 2021-01-02                    1
    3   2 2021-01-05                    2
    4   2 2021-01-06                    0
    5   2 2021-01-12                    1
    6   3 2021-01-01                    2
    7   3 2021-01-02                    0
    8   3 2021-01-04                    1
    9   3 2021-01-11                    1
    10  4 2021-01-01                    1
    

    在这里,您的day 采用年-月-日格式(因此在转换为日期时,您无需提供单独的格式)。

    此外,您还需要确保您的列名匹配并与day 保持一致。请参阅下面的类似代码 - 这应该与您想要的输出相同。

    df %>%
      mutate(day = as.Date(day)) %>%
      arrange(id, day) %>%
      group_by(id) %>%
      group_by(id2 = cumsum(c(T, diff(day) > 1)), .add = T) %>%
      mutate(num_con_days = ifelse(day == first(day), last(day) - day + 1, 0)) %>%
      ungroup %>%
      select(-id2)
    

    输出

       id        day num_consecutive_days
    1   1 2021-01-02                    1
    2   2 2021-01-02                    1
    3   2 2021-01-05                    2
    4   2 2021-01-06                    0
    5   2 2021-01-12                    1
    6   3 2021-01-01                    2
    7   3 2021-01-02                    0
    8   3 2021-01-04                    1
    9   3 2021-01-11                    1
    10  4 2021-01-01                    1
    

    【讨论】:

    • 谢谢!你能解释一下 mutate 函数中 ifelse 语句背后的逻辑吗?我对如何解释它有点困惑
    • ifelse 允许您检查 - 在组内 - 您是否正在改变该组中的第一行。如果是第一行,则将该值设置为连续日期的数量。如果它不是组中的第一行,则该值为零。这将提供与所需相同的输出,连续日期为零(第一个日期除外)。
    • 我再次尝试了您的代码,但输出似乎不一样。我只得到四列(day、id、date、num_con_days_2),它没有正确计算连续天数
    • 我编辑了答案并添加了arrange。您的帖子包括userarrange(这不在您的示例数据中-您的意思是id?)。看起来这给出了与您想要的输出类似的输出。一个区别是您想要的输出不是按id 排序的。
    • @JaneMiller 如果你没有得到相同的输出 - 你得到什么输出?你能进一步描述一下吗?如果您“仅获得四列”,那么您缺少哪些列?在您的示例中所需的输出中,您只有 4 列数据。
    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多