如何使用dpplyr在多变量汇总结果中添加年度占比列
解决方法
要得到29行的汇总结果并添加年度占比列prop,你需要分两步处理:先完成按article和date的汇总,再基于date分组计算年度总权重并推导占比。这里有两种简洁的实现方式:
方式一:链式一步完成
sample_data %>% # 第一步:按article和date分组,计算每组的总weight group_by(article, date) %>% summarise(weight = sum(value), .groups = "drop_last") %>% # 第二步:按date分组,计算年度总权重,再推导占比 mutate( total_year = sum(weight), prop = weight / total_year ) %>% # 可选:移除中间计算的total_year列 select(-total_year)
方式二:分步清晰实现
如果觉得链式调用太紧凑,也可以拆成两步,逻辑更直观:
# 第一步:先得到article-date级别的汇总表 summary_table <- sample_data %>% group_by(article, date) %>% summarise(weight = sum(value), .groups = "drop") # 第二步:基于年度计算占比 summary_table %>% group_by(date) %>% mutate(prop = weight / sum(weight))
为什么你的原有代码出错?
你之前的代码在summarise里直接使用了原始列value,这会触发dplyr的分组内保留所有原始行的行为——因为value不是聚合函数(比如sum()),dplyr会把每个分组里的所有value值都保留下来,最终行数回到原始数据的50行,而不是你期望的29行汇总结果。
结果验证
运行上述代码后,每个date对应的所有prop之和会等于1,比如验证2015年的占比总和:
# 验证2015年的prop和为1 result %>% filter(date == "2015") %>% pull(prop) %>% sum() # 输出应为1(可能因浮点精度略有误差,比如0.999999999999999)
内容的提问来源于stack exchange,提问作者nuke
相关产品推荐
相关产品推荐

