如何在R中按ID合并具有连续日期区间的记录?
R语言合并连续日期区间记录
实现思路
核心是给每个连续的日期区间组打标识,再按组合并起止日期。用dplyr包就能搞定,步骤清晰:
- 按ID分组后,先把每个ID下的记录按
Start_date排序(保证日期顺序正确) - 判断当前行的
Start_date是否和上一行的End_date连续,生成分组标识 - 按ID和分组标识聚合,取每组最早的
Start_date和最晚的End_date
代码实现
先加载示例数据和必要的包:
library(dplyr) # 示例原始数据 df <- structure(list(ID = c(565, 898, 521, 522, 522, 323, 887, 887, 522), Start_date = structure(c(12846, 19172, 19341, 19495, 19497, 19495, 14194, 14204, 18786), class = "Date"), End_date = structure(c(12847, 19174, 19347, 19497, 19499, 19497, 14203, 14206, 18798), class = "Date")), row.names = c(NA, -9L), class = c("tbl_df", "tbl", "data.frame"))
然后执行合并操作:
merged_df <- df %>% # 按ID分组,内部按开始日期排序 group_by(ID) %>% arrange(Start_date, .by_group = TRUE) %>% # 生成连续区间的分组标识:当前行Start_date不等于上一行End_date时,新建组 mutate(group_id = cumsum(Start_date != lag(End_date, default = first(Start_date) - 1))) %>% # 按ID和分组标识聚合,取最小开始日期和最大结束日期 group_by(ID, group_id) %>% summarize(Start_date = min(Start_date), End_date = max(End_date), .groups = "drop") %>% # 移除临时的group_id字段 select(-group_id)
验证结果
查看合并后的数据,和目标数据一致:
print(merged_df) # 输出结果与示例目标数据完全匹配
关键代码解释
arrange(Start_date, .by_group = TRUE):确保每个ID下的记录按开始日期升序排列,避免顺序错乱导致分组错误lag(End_date, default = first(Start_date) - 1):取上一行的End_date,第一行默认用早于自身Start_date的日期,保证第一行生成新组cumsum(...):通过累加布尔值(TRUE=1,FALSE=0)生成唯一的分组ID,把连续的区间归为同一组
内容的提问来源于stack exchange,提问作者Bob Vila
相关产品推荐
相关产品推荐

