R语言用mutate与case_when实现分组条件触发后终止计算
实现代码调整
核心实现逻辑
在现有完成is_churn标记的流程后,按客户分组做行截断处理:
- 定位每个客户观测序列中第一个满足
is_churn == "Yes"的行位置 - 保留观测序列从起始行到该定位位置的所有行;如果客户在全观测周期内没有出现流失标记,就保留全部观测行
- 因
crossing展开后的数据集本身已按客户分组、观测时间正序排列,无需额外调整行序即可保证截断逻辑符合时间先后要求
完整可运行代码
df %>% filter(termination_date > first_obs | is.na(termination_date)) %>% crossing(obs_seq) %>% mutate(is_churn = case_when( termination_date >= obs_seq & termination_date < (obs_seq + obs_interval) ~ "Yes", TRUE ~ "No" )) %>% group_by(customer) %>% slice(seq_len(if_else( any(is_churn == "Yes"), which.max(is_churn == "Yes"), n() ))) %>% ungroup()
关键逻辑说明
which.max(is_churn == "Yes"):在逻辑判定向量中定位第一个TRUE值的索引(即第一个流失标记所在的行号)。逻辑向量中TRUE对应数值1、FALSE对应0,最大值首次出现的位置就是满足条件的第一行位置if_else分支判断:当客户分组内无任何流失标记时,取分组总行数n()做截断,等价于完整保留该客户所有观测行- 运行上述代码后的输出行数、行内容与预期的27行结果完全匹配,不会改动原有
is_churn的判定规则
内容的提问来源于stack exchange,提问作者Desmond
相关产品推荐
相关产品推荐

