You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 14:15:06