如何在R中对存在重叠(含容错间隔)的时间范围行分组?
服务周期重叠/间隔≤1天的人员分组问题
现有人员接受服务的记录数据,包含字段:
personid:人员IDstreamid:服务类型IDdatetimestart:服务开始日期datetimeend:服务结束日期(服务进行中则为缺失值)
需要按人员分组,将服务周期重叠或前后间隔不超过1天的记录归为同一组。下方测试数据已手动标注目标分组(targetgroup字段):
library(tidyverse) test <- type_convert(tribble( ~personid, ~streamid, ~datetimestart, ~datetimeend, ~targetgroup, 1, 1, "2023-01-01", "2023-01-05", 1, 1, 2, "2023-01-07", "2023-01-30", 2, 2, 2, "2023-12-01", NA_character_, 1, 2, 1, "2024-01-12", "2024-01-30", 1, 2, 3, "2024-02-10", "2024-02-28", 1, 2, 1, "2024-02-25", NA_character_, 1, 3, 3, "2023-12-01", "2024-01-14", 1, 3, 2, "2024-01-12", "2024-01-30", 1, 3, 1, "2024-01-10", "2024-02-01", 1, 4, 3, "2023-12-01", "2024-01-14", 1, 4, 2, "2024-01-12", "2024-01-20", 1, 4, 1, "2024-01-21", NA_character_, 1 )) #> #> ── 列规格说明 ──────────────────────────────────────────────────────── #> cols( #> datetimestart = col_date(format = ""), #> datetimeend = col_date(format = "") #> )
我尝试使用lag或coalesce函数实现分组,但对于personid=2这类非按开始日期排序但服务周期存在重叠的情况,无法得到正确结果。以下是目前的最优实现代码及结果:
test %>% arrange(personid, datetimestart) %>% group_by(personid) %>% mutate(new_episode_group = datetimestart - lag(datetimeend) > days(1), new_episode_group = if_else(is.na(new_episode_group), FALSE, new_episode_group), group = cumsum(new_episode_group) + 1) %>% select(-new_episode_group) #> # A tibble: 12 × 6 #> # Groups: personid [4] #> personid streamid datetimestart datetimeend targetgroup group #> <dbl> <dbl> <date> <date> <dbl> <dbl> #> 1 1 1 2023-01-01 2023-01-05 1 1 #> 2 1 2 2023-01-07 2023-01-30 2 2 #> 3 2 2 2023-12-01 NA 1 1 #> 4 2 1 2024-01-12 2024-01-30 1 1 #> 5 2 3 2024-02-10 2024-02-28 1 2 #> 6 2 1 2024-02-25 NA 1 2 #> 7 3 3 2023-12-01 2024-01-14 1 1 #> 8 3 1 2024-01-10 2024-02-01 1 1 #> 9 3 2 2024-01-12 2024-01-30 1 1 #> 10 4 3 2023-12-01 2024-01-14 1 1 #> 11 4 2 2024-01-12 2024-01-20 1 1 #> 12 4 1 2024-01-21 NA 1 1
内容的提问来源于Stack Exchange,提问作者Mathew Ling
相关产品推荐
相关产品推荐

