如何在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
相关产品推荐
相关产品推荐

