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

如何在R中一次性计算group_by分组的明细汇总与各维度合计值

R 分组统计同步生成多维度合计的实现方案

你可以直接通过以下两种方式实现需求,无需手动计算多个子表再合并:

方案1:dplyr 原生 rollup() 函数(推荐,无额外依赖)

rollup() 是dplyr 1.0.0版本后新增的函数,专门用于生成多层级的分组合计结果,代码改动极小:

library(tidyverse)
DF %>%
  # 按你需要的维度生成所有层级的分组:交叉分组、job单维度、gender单维度、整体合计
  group_by(job, gender) %>%
  rollup(.groups = "drop") %>%
  summarize(
    people = sum(people, na.rm = T),
    # 注意合计工资要用加权平均,不能直接求平均,否则结果错误
    wage = sum(wage * people, na.rm = T) / people
  ) %>%
  # 可选:将默认的合计标识NA替换为Total,和你期望的格式对齐
  mutate(
    job = replace_na(job, "Total"),
    gender = replace_na(gender, "Total")
  ) %>%
  # 可选:按job、gender排序,输出顺序和样例一致
  arrange(job, gender)

运行后输出的结构和你期望的完全一致。

方案2:janitor 包 adorn_totals() 函数(语法更简洁)

如果可以使用第三方工具包,janitor的合计处理函数语法更简单:

library(tidyverse)
library(janitor)
# 先计算交叉分组的明细结果
detail_df <- DF %>%
  group_by(job, gender) %>%
  summarize(
    people = sum(people, na.rm = T),
    wage = weighted.mean(wage, people, na.rm = T)
  ) %>%
  ungroup()
# 批量添加各维度合计
result <- detail_df %>%
  # 添加每个job的gender合计
  group_by(job) %>%
  group_modify(~ adorn_totals(.x, name = "Total")) %>%
  ungroup() %>%
  # 添加每个gender的job合计 + 总合计
  group_by(gender) %>%
  group_modify(~ adorn_totals(.x, name = "Total")) %>%
  ungroup()

注意:如果不需要自定义合计行的标识为Total,可以省略替换NA的步骤,直接使用dplyr默认的NA作为合计标识即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:57:03