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

R语言:按诊断分组计算测试题均值并绘制分组柱状图

问题解决:按诊断分组计算测试题均值并绘制组间差异柱状图

原始数据

首先构造并展示原始数据框:

ID <- c("a", "b", "c", "d", "e")
age <- c(22, 34, 55, 55, 45)
gender <- c("female", "male", "female", "female", "male")
diagnosis <- c(1, 2, 2, 1, 1)
A1 <- c(4,5,12,45,33)
A2 <- c(12,15,46,34,56)
A3 <- c(23,33,45,66,32)
mydf <- data.frame(ID, age, gender, diagnosis, A1, A2, A3)
mydf
IDagegenderdiagnosisA1A2A3
a22female141223
b34male251533
c55female2124645
d55female1453466
e45male1335632

问题与错误尝试

需求为按diagnosis分组计算A1、A2、A3的均值,并绘制组间差异柱状图。用户尝试通过以下代码添加均值行,但非测试题列被错误填充了均值:

mydf <- rbind(mydf, "mean" = round(colMeans(mydf[,5:7], na.rm = TRUE), 2))
mydf

错误结果示例:

IDagegenderdiagnosisA1A2A3
a22.0female14.012.023.0
b34.0male25.015.033.0
c55.0female212.046.045.0
d55.0female145.034.066.0
e45.0male133.056.032.0
19.832.639.819.832.639.819.8

错误原因

rbind要求新增行的列数与原数据框完全匹配。用户仅计算了A1-A3的均值(长度为3的向量),rbind会自动循环填充该向量到所有7列,导致非测试题列被错误赋值。

解决方案

1. 正确计算分组均值

方法1:使用dplyr包(推荐)

library(dplyr)

# 按diagnosis分组,计算A1-A3的均值并保留2位小数
group_means <- mydf %>%
  group_by(diagnosis) %>%
  summarise(across(A1:A3, ~round(mean(.), 2)))

group_means

输出结果:

diagnosisA1A2A3
127.3334.040.33
28.530.539.0

方法2:基础R实现

# 用aggregate函数分组计算均值
group_means_base <- aggregate(cbind(A1, A2, A3) ~ diagnosis, data = mydf, 
                              FUN = function(x) round(mean(x), 2))

2. 绘制组间差异柱状图

使用ggplot2绘制分组并列柱状图,需先将数据转换为长格式:

library(ggplot2)
library(tidyr)

# 转换为长格式数据,适配ggplot2绘图
long_data <- group_means %>%
  pivot_longer(cols = A1:A3, names_to = "test_item", values_to = "mean_score")

# 绘制柱状图
ggplot(long_data, aes(x = test_item, y = mean_score, fill = factor(diagnosis))) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  labs(title = "不同诊断组测试题得分均值",
       x = "测试题",
       y = "均值得分",
       fill = "诊断分组") +
  theme_minimal() +
  scale_fill_manual(values = c("#1f77b4", "#ff7f0e"), labels = c("患病", "未患病")) +
  geom_text(aes(label = mean_score), 
            position = position_dodge(width = 0.8), 
            vjust = -0.5, size = 3.5)

该代码会生成并列分组柱状图,每个测试题对应两个柱子(诊断1和2),柱子上方标注均值,清晰展示组间得分差异。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:35:29