R语言dplyr中case_when实现跨组条件赋值的方法
错误根源
原代码执行group_by(x)后分组状态会持续留存,后续操作始终处于按x拆分的分组上下文,每个分组内仅能访问本组数据,无法跨组提取b组的累计计算结果。
正确实现代码
library(dplyr) df %>% # 1. 计算b组y列累计和,非b组保留原始值 mutate(y = case_when( x == "b" ~ cumsum(y * (x == "b")), TRUE ~ y )) %>% # 2. 提取b组累计结果的最后值,赋值给所有a组行 mutate(y = case_when( x == "a" ~ last(y[x == "b"]), TRUE ~ y ))
执行结果
x y 1 a 15 2 a 15 3 a 15 4 b 4 5 b 9 6 b 15 7 c 7 8 c 8 9 c 9 10 a 15 11 a 15 12 a 15
逻辑说明
- 通过
y * (x == "b")将非b组的y值置0,计算全列累计和时仅b组数值参与累加,再通过case_when把b组的y值替换为对应累计结果,其余组保留原始值 - 第二步取消分组状态,在全量数据上下文中直接筛选b组的y值,取最后一个值赋给所有a组的行,c组保持原值不变,完全匹配需求
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

