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

如何在dplyr管道中按两类分组计算数值占比?

简化按分组计算占比的实现方法

当然有更简洁的实现方式啦!你原来的代码需要先单独汇总分组总和,再通过连接把结果合并回去,其实用dplyr的窗口函数就能一步完成,不用额外生成中间表和做连接操作,代码会更紧凑易读。

优化后的完整代码

library(dplyr)

# 模拟数据
haves <- data.frame(
  date = as.Date(c("2019-01-01", "2019-01-01", "2019-01-01", "2019-02-01", "2019-02-01")),
  value = c(10, 22, 44, 8, 10),
  cat = c("a", "a", "b", "c", "c")
)

# 一步计算目标结果
wants <- haves %>%
  group_by(date, cat) %>%
  mutate(
    total_value = sum(value),  # 窗口函数:计算当前date+cat组的总和
    percentage_of_total = (value / total_value) * 100
  ) %>%
  ungroup()  # 可选:如果不需要保留分组状态可以取消分组

wants

代码解释

  • 直接在group_by(date, cat)之后使用mutate,sum(value)会自动在每个分组内计算总和,并将这个值填充到该分组的每一行中——这就是窗口函数的作用,完全不需要单独做summarise。
  • 省去了中间的sum_stats表和inner_join步骤,代码逻辑更连贯,也减少了出错的可能。
  • 运行后得到的结果和你想要的完全一致:
# A tibble: 5 × 5
  date       value cat   total_value percentage_of_total
  <date>     <dbl> <chr>       <dbl>               <dbl>
1 2019-01-01    10 a              32                31.2
2 2019-01-01    22 a              32                68.8
3 2019-01-01    44 b              44               100  
4 2019-02-01     8 c              18                44.4
5 2019-02-01    10 c              18                55.6

另外,你原来代码里加载了lubridate但没用到,优化后的代码里可以去掉这个不必要的加载哦😉

内容的提问来源于stack exchange,提问作者cs0815

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:28:13