我按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和过滤两周内发生的事件,但可能有很多事件对应于一个两周的时间。
答案 0 :(得分:1)
您可以使用cut
和seq
四舍五入到最接近的两周截止值,然后使用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