R语言分组合计计算后如何自动引用合计值计算组内占比
解决方案
你不需要手动硬编码分组合计值,也不用写嵌套ifelse,直接利用dplyr的分组计算逻辑就能自动完成全流程,自动适配任意分组,后续新增分组也不用改核心逻辑。
核心实现代码
library(dplyr) library(janitor) # 构造示例数据(修正原代码cbind导致数值型total被转成字符的问题) age <- rep(c('10-15','15-30','30-45'), 10) country <- rep(c('Brazil','Japan','Turkey','Japan','Turkey',"Brazil"), 5) total <- sample(1:100, 30) df <- data.frame(age, country, total) # 自动计算分组合计、占比并添加合计行 df <- df %>% arrange(age) %>% # 按年龄维度分组 group_by(age) %>% mutate( # 自动计算当前年龄组的total合计,无需手动输入数值 age_total = sum(total), # 计算单条记录占对应年龄组合计的百分比 pct = total / age_total * 100 ) %>% # 为每个分组添加合计行,合计行的pct自动填充为NA group_modify(~adorn_totals(.x, where = "row", fill = NA, na.rm = TRUE)) %>% ungroup() %>% # 不需要保留中间计算的age_total列就加下面这行,要保留就删掉 select(-age_total)
逻辑说明
- 之前你用
split拆分数据再批量加合计行的思路是对的,但没有在分组环境中把分组合计值保存下来,才需要后续手动硬编码数值。group_by()搭配mutate()的组合会自动按分组执行计算,sum(total)会自动匹配当前行所属分组的合计值,不管你有多少个年龄分组、分组名称是什么,都不需要手动修改代码。 - 用
group_modify()搭配janitor::adorn_totals()给每个分组加合计行时,合计行不会参与mutate()的占比计算,会自动给pct列填充NA,和你手动实现的输出效果完全一致。 - 如果后续需要增加分组维度(比如同时按年龄、性别分组计算占比),只需要在
group_by()里新增对应的列名即可,其余代码不用做任何调整,灵活性远高于嵌套ifelse的写法。
输出效果
运行后得到的结构和你手动计算的结果完全一致,示例如下:
age country total pct 1 10-15 Brazil 51 9.57 2 10-15 Japan 28 5.25 3 10-15 Brazil 90 16.89 4 10-15 Japan 38 7.13 5 10-15 Brazil 48 9.01 6 10-15 Japan 52 9.76 7 10-15 Brazil 34 6.38 8 10-15 Japan 69 12.95 9 10-15 Brazil 66 12.38 10 10-15 Japan 57 10.70 11 Total - 533 NA 12 15-30 Japan 62 12.28 ...
内容的提问来源于stack exchange,提问作者user19250276
相关产品推荐
相关产品推荐

