在R中如何合并多组重叠的日期间隔?附示例与预期结果
R语言合并重叠日期间隔实现
核心逻辑
对同分组(本需求下为id和degree字段)下的记录按开始日期排序后,识别与前序所有间隔都不重叠的新间隔边界,再按新的间隔组聚合,取每组最小开始日期、最大结束日期即可得到合并后的结果。
方法1:基于tidyverse通用实现(无需安装小众依赖包)
需先加载dplyr和lubridate包:
library(dplyr) library(lubridate)
实现代码:
df_result <- df %>% # 指定分组维度,同分组内的间隔才需要合并 group_by(id, degree) %>% # 同分组内按开始日期升序排列 arrange(start_date, .by_group = TRUE) %>% # 生成新间隔分组标记:当前间隔开始日期晚于之前所有间隔的最大结束日期时,记为新的一组 mutate(interval_group = cumsum(start_date > lag(stop_date, default = first(start_date) - 1))) %>% # 按新的间隔分组聚合 group_by(id, degree, interval_group) %>% summarise( start_date = min(start_date), stop_date = max(stop_date), .groups = "drop" ) %>% # 移除辅助计算的分组标记列 select(-interval_group)
方法2:基于ivs间隔处理包实现(代码更简洁)
ivs是R生态中专门用于间隔数据处理的包,内置了间隔合并的封装方法:
# 首次使用需先安装:install.packages("ivs") library(ivs) library(dplyr) df_result <- df %>% group_by(id, degree) %>% summarise( interval = iv_groups(iv(start_date, stop_date)), .groups = "drop" ) %>% # 拆分合并后的间隔为开始、结束日期列 mutate( start_date = iv_start(interval), stop_date = iv_end(interval) ) %>% select(-interval)
两种方法输出结果均与需求预期完全一致:
> df_result # A tibble: 2 × 4 id degree start_date stop_date <dbl> <dbl> <date> <date> 1 1 2 2010-01-20 2010-02-10 2 1 2 2010-03-20 2010-04-30
内容的提问来源于stack exchange,提问作者rachel3765
相关产品推荐
相关产品推荐

