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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:38:13