首页 > 解决方案 > 使用 R 按期间和 id 对日期进行分组

问题描述

我有一个按 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 滞后并过滤两周内发生的事件,但可能有很多事件对应于一个两周内。

标签: rdplyr

解决方案


您可以使用cutandseq舍入到最接近的两周截止值,然后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

推荐阅读