R语言mutate函数按相同月份分组求和after.tax实现方法
问题根因
你写的代码无法运行核心是两个语法逻辑错误:
case_when是逐行做条件匹配赋值的函数,内部不支持嵌入for循环逻辑- 同字段分组聚合不需要手动写循环遍历行,dplyr原生提供了分组计算能力,比手写循环效率高、出错概率低
正确实现方案
直接在你原有数据处理管道里加入分组计算逻辑即可,不需要额外写循环判断,完整代码如下:
income.raw <- income %>% select(month, category, occurrence) %>% mutate( total = case_when( category == ".hagwon" ~ occurrence * 17000 * 3, category == ".co" ~ occurrence * 30000 * 2 ), before.tax = total, after.tax = total * 0.967 ) %>% # 按month字段分组,后续计算会按同组聚合 group_by(month) %>% # 分组状态下mutate会自动给同组所有行匹配上同组的求和结果 mutate(monthly.total = sum(after.tax)) %>% # 计算完成后取消分组,避免后续其他数据处理操作受分组逻辑干扰 ungroup()
结果说明
对应你提供的示例数据,计算结果完全符合预期:
- month值为4的行,
monthly.total取值为164225.61 - month值为5的行,
monthly.total取值为576096.51 - month值为6的两行,
monthly.total统一取值为508470 + 299100 = 807570
小提示:如果你的原始数据里
after.tax字段存在空值(NA),求和时可以给sum加参数na.rm = TRUE,也就是写成sum(after.tax, na.rm = TRUE),避免空值导致整组汇总结果返回NA。
内容的提问来源于stack exchange,提问作者samuel lee
相关产品推荐
相关产品推荐

