R语言dplyr分组汇总后用mutate计算占比结果全为1如何解决
问题原因
- dplyr的
summarize()执行后默认会丢弃最后一层分组变量,保留上层分组结构。示例代码先通过group_by(country, group)设置了两层分组,执行完summarize(cost=sum(cost))后,数据仍然保留了country层级的分组。 - 后续
mutate计算sum(cost)时只会在当前country分组内求和,而每个country分组下只有1行数据,sum(cost)就等于当前行的cost值,因此最终share列全部为1。调换两个分组变量的顺序无法解决问题,因为无论顺序如何,summarize执行后都会保留一层分组,每组内仍只有1行数据。
修复方案
如果需要计算每行成本占全局总成本的比例,只需要在计算share前取消所有分组即可,有两种写法可选:
写法1:通过ungroup()主动取消分组
db %>% group_by(country, group) %>% summarize(cost = sum(cost)) %>% ungroup() %>% # 取消所有分组 mutate(share = cost / sum(cost))
写法2:在summarize中直接指定丢弃分组
(仅适用于dplyr 1.0.0及以上版本)
db %>% group_by(country, group) %>% summarize(cost = sum(cost), .groups = "drop") %>% # 聚合后直接丢弃所有分组 mutate(share = cost / sum(cost))
如果需要计算每个group下,不同国家的成本占该group总成本的比例,只需要在聚合后重新按group分组即可:
db %>% group_by(country, group) %>% summarize(cost = sum(cost), .groups = "drop") %>% group_by(group) %>% # 重新按group分组 mutate(share = cost / sum(cost))
内容的提问来源于stack exchange,提问作者João Paulo
相关产品推荐
相关产品推荐

