如何创建每组行数不同的分组箱线图?解决数据框构建报错问题
解决不同样本量处理组的分组箱线图绘制问题
报错原因
直接用data.frame()合并不同长度的向量会报错,因为数据框要求所有列的行数必须一致,但你的三个处理组(QX、Lido、Vehicle)试验次数不同,对应的pre/post向量长度不匹配,无法直接拼成宽格式数据框。
解决方案:转换为长格式数据
要绘制符合需求的分组箱线图,需要先把数据整理成长格式(tidy data)——每一行对应一个观测,包含处理组、时间点(pre/post)、响应值三个变量。以下是两种实现方式:
方式1:手动构造合并(基础R)
# 原始数据向量 QXpre <- c(3,4,2,1,4,5,4,2,8) QXpost <- c(0,4,0,0,0,7,0,1,6) lidopre <- c(5,3,4,5,6) lidopost <- c(0,0,0,1,2) vehipre <- c(3,3,5,3,4,3,4) vehipost <- c(4,3,3,12,6,4,10) # 为每个处理组单独构造数据框 qx_df <- data.frame( treatment = "QX", time = rep(c("pre", "post"), each = length(QXpre)), value = c(QXpre, QXpost) ) lido_df <- data.frame( treatment = "Lido", time = rep(c("pre", "post"), each = length(lidopre)), value = c(lidopre, lidopost) ) vehi_df <- data.frame( treatment = "Vehicle", time = rep(c("pre", "post"), each = length(vehipre)), value = c(vehipre, vehipost) ) # 合并所有处理组的数据 df <- rbind(qx_df, lido_df, vehi_df)
方式2:用tidyverse高效转换(推荐)
library(tidyverse) # 原始数据向量 QXpre <- c(3,4,2,1,4,5,4,2,8) QXpost <- c(0,4,0,0,0,7,0,1,6) lidopre <- c(5,3,4,5,6) lidopost <- c(0,0,0,1,2) vehipre <- c(3,3,5,3,4,3,4) vehipost <- c(4,3,3,12,6,4,10) # 打包成命名列表,再转换为长格式 data_list <- list( QX = list(pre = QXpre, post = QXpost), Lido = list(pre = lidopre, post = lidopost), Vehicle = list(pre = vehipre, post = vehipost) ) df <- data_list %>% enframe(name = "treatment", value = "data") %>% unnest_wider(data) %>% pivot_longer(cols = c(pre, post), names_to = "time", values_to = "value")
绘制分组箱线图
用ggplot2绘制图,实现同一处理组内pre/post对比、跨组整体比较的需求:
ggplot(df, aes(x = treatment, y = value, fill = time)) + geom_boxplot(position = position_dodge(width = 0.8)) + # 让同一处理组的两个箱线图并排 labs( title = "各处理组前后响应值对比", x = "处理组", y = "响应值", fill = "时间点" ) + theme_minimal()
这个图会展示三个处理组,每个组内有pre和post两个箱线图,既可以对比组内前后变化,也能直观比较不同处理组的响应差异。
内容的提问来源于stack exchange,提问作者Nurit Eliana
相关产品推荐
相关产品推荐

