R data.table按人员分组为重叠日期区间新增最大起止日期列
问题根因
你当前的代码仅按人员ID(prs_nat_key/person_id)单维度分组,因此只会取该人员全量记录中最大days_diff对应的第一组日期,没有预先对同一个人员下的不重叠服务区间做拆分分组,所以导致所有行返回相同的起止日期。
解决代码
你需要先对同一个人员的所有记录做重叠区间合并分组,再按「人员ID+区间分组ID」双维度分组计算两个目标列,完整实现代码如下:
library(data.table) library(lubridate) # 1. 先按人员ID、服务开始日期排序,保证区间判断逻辑正确 setorder(ex, person_id, serv_from_dt) # 2. 为每个人员生成不重叠区间的分组ID ex[, group_id := cumsum(serv_from_dt > shift(cummax(serv_to_dt), fill = first(serv_to_dt) - 1)), by = person_id] # 3. 按人员ID+区间分组ID双维度分组,取当前区间内最大days_diff对应的起止日期 ex[, `:=`( max_start_date = serv_from_dt[which.max(days_diff)], max_end_date = serv_to_dt[which.max(days_diff)] ), by = .(person_id, group_id)] # 可选:删除中间生成的辅助列group_id ex[, group_id := NULL]
逻辑说明
- 区间分组逻辑:通过
cummax(serv_to_dt)计算截至当前行的最大服务结束日期,若当前行的服务开始日期大于之前所有行的最大服务结束日期,则判定为新的不重叠区间,用cumsum累加生成唯一的分组ID - 分组计算逻辑:同一个不重叠区间内的所有行共享同一个
max_start_date和max_end_date,取区间内days_diff最大值对应的起止日期即可 - 如果你实际业务中的人员ID列名是
prs_nat_key,把代码里的person_id替换为对应列名即可。
内容的提问来源于stack exchange,提问作者vizidea
相关产品推荐
相关产品推荐

