如何用R的data.table按ID检测重叠日期范围并计算曝光占比
使用data.table处理客户合同重叠时段的曝光量计算
需求概述
- 数据集以
ID标识客户,每个客户有多份合同,每份合同包含PERIODSTART(起始日期)和PERIODEND(结束日期)字段 - 需筛选出同一ID下存在两份及以上重叠合同的客户案例
- 按
ID和PRODUCTNUMBER分组,计算每份合同的年度占比曝光量,核心要求:合同重叠时段的曝光量不重复计算
示例数据集
library(data.table) data = data.table(ID = c(rep("customer_1000", 7), rep("customer_78", 4), rep("customer_1047", 4)), PERIODSTART = as.Date(c("1991-02-03", "1991-11-06", "1993-02-03", "1993-03-11", "1996-02-03", "1996-11-28", "1996-11-29", "2021-02-17", "2021-06-10", "2021-12-03", "2021-06-28", "2021-02-17", "2021-02-17", "2021-05-02", "2021-06-28")), PERIODEND = as.Date(c("1991-11-06", "1992-02-03", "1993-03-11", "1994-02-03", "1996-11-28", "1996-11-29", "1997-02-03", "2021-09-30", "2021-11-09", "2021-12-20", "2021-10-14", "2021-09-30", "2021-08-01", "2021-06-17", "2021-10-14")), PRODUCTNUMBER = c(rep("product_1", 7), "product_74", "product_88", "product_76", "product_25", "product_1", "product_2", "product_3", "product_4") ) data[, year := year(PERIODSTART)]
期望计算规则
- 基础非重叠场景:单份合同的曝光量为其时段在对应年度的天数占比(年度天数需根据平闰年取365或366)
- 部分重叠场景:两份合同存在重叠区间时,重叠部分仅计算一次曝光量,每份合同的有效曝光为自身非重叠时段占比,加上重叠时段占比按合同数量均分
- 嵌套重叠场景:多份合同完全嵌套时,仅计算最外层合同的完整时段,内部合同的重叠区域不重复计算曝光量
- 交叉重叠场景:多份合同交叉覆盖时,先合并所有重叠区间为连续的无重叠时段,再统计每份原始合同在这些时段中的覆盖长度,最终换算为年度占比
内容的提问来源于stack exchange,提问作者nimliug
相关产品推荐
相关产品推荐

