使用R将日期按期间和ID分组

时间:2018-05-07 16:54:48

标签: r dplyr

我按ID列出了一系列事件,并希望在两周内将它们分组。每当ID发生第一个事件时,应该开始两周。分组的事件数据应如下所示:

ID    Date          Group
<dbl> <date>        <dbl>
1     2018-01-01    1
1     2018-01-02    1
1     2018-01-02    1
1     2018-02-01    2
1     2018-03-01    3
2     2018-01-01    4
2     2018-04-01    5

dat = structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L), Date = structure(c(17532, 
17533, 17533, 17563, 17591, 17532, 17622), class = "Date"), Group = c(1L, 
1L, 1L, 2L, 3L, 4L, 5L)), .Names = c("ID", "Date", "Group"), row.names = c(NA, 
-7L), class = c("tbl_df", "tbl", "data.frame"))

我最初想的是滞后于ID和过滤两周内发生的事件,但可能有很多事件对应于一个两周的时间。

2 个答案:

答案 0 :(得分:1)

您可以使用cutseq四舍五入到最接近的两周截止值,然后使用group_indices来增加索引:

dat %>% 
  group_by(ID) %>% 
  mutate(g = cut(Date, seq(first(Date), max(Date) + 14, by="2 weeks")) %>% as.character) %>% 
  ungroup %>%
  mutate(g = group_indices(., ID, g))

# A tibble: 7 x 4
     ID       Date Group     g
  <int>     <date> <int> <int>
1     1 2018-01-01     1     1
2     1 2018-01-02     1     1
3     1 2018-01-02     1     1
4     1 2018-02-01     2     2
5     1 2018-03-01     3     3
6     2 2018-01-01     4     4
7     2 2018-04-01     5     5

答案 1 :(得分:0)

获取相邻'日期与difftime的区别,将unit指定为“周”,检查差异是否大于2,并获得累计金额

dat %>%
    mutate(GroupNew = cumsum(abs(difftime(Date, lag(Date, 
              default = first(Date)), unit = "week")) > 2) + 1)
# A tibble: 7 x 4
#     ID Date       Group GroupNew
#  <int> <date>     <int>    <dbl>
#1     1 2018-01-01     1        1
#2     1 2018-01-02     1        1
#3     1 2018-01-02     1        1
#4     1 2018-02-01     2        2
#5     1 2018-03-01     3        3
#6     2 2018-01-01     4        4
#7     2 2018-04-01     5        5