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

如何在R的data.table中按ID合并重叠日期范围

高效合并data.table中按id分组的重叠/包含日期范围

需求:使用R的data.table处理千万级数据集(超十万分组id),按id分组合并重叠或包含的日期范围,生成无重叠的唯一日期区间。

示例输入数据

input <- data.table(
  id = c(rep(1, 4), rep(2, 3), rep(3, 2)),
  from_date = c('2000-01-01', '2001-01-01', '2002-01-01', '2003-01-01',
                 '2000-01-01', '2001-01-01', '2002-01-01',
                 '2000-01-01', '2001-01-01'),
  to_date = c('2000-06-01', '2003-06-01', '2002-06-01', '2003-10-01',
              '2001-05-01', '2001-02-01', '2002-06-01',
              '2000-06-01', '2002-06-01')
)

打印输入:

> input
   id  from_date    to_date
1:  1 2000-01-01 2000-06-01
2:  1 2001-01-01 2003-06-01
3:  1 2002-01-01 2002-06-01
4:  1 2003-01-01 2003-10-01
5:  2 2000-01-01 2001-05-01
6:  2 2001-01-01 2001-02-01
7:  2 2002-01-01 2002-06-01
8:  3 2000-01-01 2000-06-01
9:  3 2001-01-01 2002-06-01

期望输出

> output
   id  from_date    to_date
1:  1 2000-01-01 2000-06-01
2:  1 2001-01-01 2003-10-01
3:  2 2000-01-01 2001-05-01
4:  2 2002-01-01 2002-06-01
5:  3 2000-01-01 2000-06-01
6:  3 2001-01-01 2002-06-01

高效解决方案(data.table实现)

针对大数据量优化,核心思路是利用data.table的分组排序和累积计算,避免循环操作:

# 1. 转换日期字符为Date类型(确保日期比较逻辑正确)
input[, c("from_date", "to_date") := lapply(.SD, as.Date), .SDcols = c("from_date", "to_date")]

# 2. 按id分组后对from_date排序,保证区间按起始时间有序
input_sorted <- input[order(id, from_date)]

# 3. 计算分组内的累积最大to_date,标记新的独立区间
input_sorted[, group := cumsum(from_date > shift(cummax(to_date), fill = as.Date("1970-01-01"))), by = id]

# 4. 按id和group聚合,得到合并后的区间
output <- input_sorted[, .(from_date = min(from_date), to_date = max(to_date)), by = .(id, group)]

# 可选:移除group列,匹配期望输出格式
output[, group := NULL]

代码说明

  • 日期类型转换:将字符型日期转为Date格式,是后续日期比较、排序的基础。
  • 排序:按id和from_date排序,确保每个id下的区间按起始时间排列,这是合并重叠区间的必要前提。
  • 累积标记分组:用cummax(to_date)计算当前及之前所有区间的最大结束日期,shift将其错位一行,通过from_date > 累积最大to_date判断当前区间是否与之前区间不重叠,cumsum生成分组标记,同一标记的区间需合并。
  • 聚合合并:按id和标记分组,取最小起始日期和最大结束日期,完成区间合并。

该方案利用data.table的向量化操作和分组优化,性能远优于循环或低效分组方法,适配千万级数据处理场景。

内容的提问来源于stack exchange,提问作者user1165199

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:08:31