使用dplyr分组计算占比时代码过于繁琐,有无更简洁的实现方案?
简洁实现方案
以下两种方案都可以得到和你现有逻辑完全一致的计算结果,且步骤更简洁、可读性更强:
方案1:基于dplyr原生分组逻辑实现
思路:先按year+weight分组求和,利用summarise的分组控制参数,无需反复切换分组维度,也不需要额外去重:
library(dplyr) df %>% group_by(year, weight) %>% # 求和后自动丢弃weight分组,仅保留上层year分组 summarise(sum_quantity = sum(quantity), .groups = "drop_last") %>% # 直接按year分组计算占比 mutate(sum_quantity = sum_quantity / sum(sum_quantity))
如果使用的dplyr版本较低不支持.groups参数,改成下面的写法即可兼容:
df %>% group_by(year, weight) %>% summarise(sum_quantity = sum(quantity)) %>% group_by(year) %>% mutate(sum_quantity = sum_quantity / sum(sum_quantity))
方案2:用count函数简化求和步骤
如果希望代码更短,可以用count的wt参数直接实现加权分组计数,替代group_by+sum的组合写法:
df %>% # wt参数指定按quantity字段求和,name参数自定义求和结果的列名 count(year, weight, wt = quantity, name = "sum_quantity") %>% group_by(year) %>% mutate(sum_quantity = sum_quantity / sum(sum_quantity))
内容的提问来源于stack exchange,提问作者symbolrush
相关产品推荐
相关产品推荐

