使用dplyr添加列:匹配CustomerID时判断EnterDate与前序ExitDate间隔<30天
解决方案
修改后代码
library(dplyr) df %>% group_by(CustomerID) %>% # 同时转换EnterDate和ExitDate为日期格式,确保日期计算正确 mutate(EnterDate = as.Date(EnterDate, tryFormats = "%d/%m/%Y"), ExitDate = as.Date(ExitDate, tryFormats = "%d/%m/%Y"), # 替换为比较当前EnterDate与前一条记录的ExitDate的间隔 ResaleWithin30 = as.integer(EnterDate - lag(ExitDate) <= 30), # 首条记录补0 ResaleWithin30 = replace_na(ResaleWithin30, 0)) %>% # 把日期转回原格式输出(可选,根据需求保留) mutate(EnterDate = format(EnterDate, "%d/%m/%Y"), ExitDate = format(ExitDate, "%d/%m/%Y")) %>% ungroup()
改动说明
- 新增
ExitDate的日期类型转换:原代码只处理了EnterDate,如果ExitDate是字符格式,日期差值计算会出错,必须统一转换为日期类型。 - 核心修改:将
lag(EnterDate)替换为lag(ExitDate),实现当前记录的EnterDate与上一条记录的ExitDate的间隔判断,完全匹配需求规则。 - 保留
replace_na(ResaleWithin30, 0):确保每个CustomerID的首条记录标记为0。
运行结果
执行上述代码后,输出结果与期望表格完全一致:
| CustomerID | EnterDate | ExitDate | ResaleWithin30 |
|---|---|---|---|
| 1 | 14/09/2021 | 15/09/2021 | 0 |
| 1 | 03/10/2021 | 11/10/2021 | 1 |
| 2 | 03/10/2021 | 01/10/2021 | 0 |
| 2 | 17/10/2021 | 11/11/2021 | 1 |
| 3 | 03/10/2021 | 11/10/2021 | 0 |
| 3 | 30/12/2021 | 31/12/2021 | 0 |
| 4 | 03/10/2021 | 09/07/2022 | 0 |
内容的提问来源于stack exchange,提问作者JeffWithpetersen
相关产品推荐
相关产品推荐

