计算连续日期 R

counting consecutive dates R

如何检查一列中的日期是否相差

使用 tidyverse 你可以 group_by id 和第二个 id id2 将相差 1 的行组合在一起日。然后,连续天数列将包括 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