You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:35:24