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

如何结合两个lapply()函数生成带Dunn检验校正p值的箱线图?

R语言嵌套lapply给多组箱线图添加显著性p值的解决方法

错误原因

你遇到的报错和代码逻辑有3个核心问题:

  • 参数传递错误:你原有代码里data = g写在了lapply()的括号外,没有传入stat_pvalue_manual()函数,导致函数无法读取p值数据,自然找不到需要的列
  • 列表未配对:直接嵌套两层lapply()会给每一张箱线图都添加整个poo列表里的所有p值,没有实现「1.3.A的图对应1.3.A的p值」的配对逻辑
  • 坐标逻辑适配问题:你设置了orientation = "horizontal"生成水平箱线图,此时stat_pvalue_manual()的y.position参数实际对应的是水平方向的x轴数值,你设置的7远小于Height和Age的实际取值范围,即使参数传对也不会显示标注

前置准备:生成符合要求的poo列表

首先确保你的poo列表和df_list顺序完全对应,每个元素是对应数据框的检验结果,且包含group1、group2、P.adj、y.position四列,以下是示例生成代码:

library(rstatix)
library(ggpubr)
# 批量生成检验结果,和df_list顺序一一对应
poo <- lapply(df_list, function(dat) {
  # 分别计算Height和Age的组间dunn检验
  p_height <- dat %>% dunn_test(Height ~ Person, p.adjust.method = "bonferroni") %>% 
    mutate(y.position = 182) # Height的标注位置设为182,在最大值上方
  p_age <- dat %>% dunn_test(Age ~ Person, p.adjust.method = "bonferroni") %>% 
    mutate(y.position = 28) # Age的标注位置设为28,在最大值上方
  # 合并两个指标的p值
  rbind(p_height, p_age) %>% select(group1, group2, P.adj = p.adj, y.position)
})

修正后的绘图代码

不要用嵌套lapply(),改用Map()函数对df_list和poo按位置配对处理,同时修正参数传递逻辑:

wales <- Map(function(p, g) { # p是df_list里的每个数据框,g是对应poo里的p值表
  ggboxplot(p, x = "Person", y = c("Height", "Age"), 
            combine = TRUE, 
            x.text.angle = 360, 
            orientation = "horizontal", 
            ylab = "Measurement (cm)",
            ggtheme = theme_gray()) + 
    font("xy.text", size = 7, color = "black") + 
    theme(legend.position = "None", 
          axis.text.x = element_text(color = "black")) +
    # 正确传入p值数据和参数
    stat_pvalue_manual(data = g, label = "P.adj", y.position = "y.position")
}, df_list, poo)

运行完成后可通过wales[[1]]查看第一个数据框对应的带p值标注的箱线图,如果不需要分开展示,也可以把combine参数改为FALSE后自行拼接图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:39:03