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

R语言:为数据框添加分组总计行并实现facet_grid可视化

解决数据框分组统计与ggplot2分面总计展示问题

需求说明

需要将数据框转换为长格式,添加分组计数、百分比;为每个am分组添加总计行;最终通过ggplot2的facet_grid实现三个分面(vs=0、vs=1、总计)——因为原生margins=TRUE无法与geom_text兼容,现有代码仅实现了基础计数和百分比,缺少am分组的总计行。


解决方案

1. 生成包含总计行的统计数据框

通过dplyr分别计算原有分组统计和am分组的总计,再合并数据框,同时标记总计行的vs类别:

library(dplyr)
library(ggplot2)
library(formattable)

# 计算am与vs交叉分组的计数和百分比
df_grouped <- mtcars %>%
  group_by(am, vs) %>%
  summarise(cnt = n(), .groups = "drop") %>%
  mutate(freq = percent(cnt / sum(cnt), digits = 1))

# 计算每个am分组的总计行
df_total <- mtcars %>%
  group_by(am) %>%
  summarise(cnt = n(), .groups = "drop") %>%
  mutate(vs = "总计",  # 标记总计分面
         freq = percent(1, digits = 1))  # 总计百分比为100%

# 合并数据并指定分面顺序
df_plot <- bind_rows(df_grouped, df_total) %>%
  mutate(vs = factor(vs, levels = c(0, 1, "总计")))

2. 调整绘图代码实现分面展示

修改facet_grid使用包含"总计"的vs列,确保geom_text正常显示:

ggplot(df_plot, aes(x = as.factor(am), y = cnt, fill = as.factor(am))) + 
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = paste(cnt, paste0('\n(', freq, ')'))), 
            vjust = -0.1, position = position_dodge(width = 0.9)) +
  facet_grid(cols = vars(vs)) +
  labs(x = "am", y = "计数", fill = "am") +
  theme_bw()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:30:51