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

如何让支持Kruskal-Wallis与Dunn检验的ggplot函数兼容tibble

解决ggplot自定义检验函数兼容tibble的问题

问题出在你用dat[,yvar]和dat[,xvar]提取列的方式上——tibble的[运算符默认返回单列tibble,而非原子向量,直接赋值给dat$var1/dat$var2会导致后续分析出错;而普通data.frame的[在提取单列时默认返回向量,所以能正常运行。

修复方案

有两种简洁的修复方式,任选其一即可:

方式1:用[[提取向量(最直接)

将提取列的代码从dat[,yvar]改为dat[[yvar]],[[运算符对data.frame和tibble都返回原子向量:

plot_w_dunn <- function(dat, xvar, yvar) {
  require("dplyr")
  # 用[[提取向量,兼容data.frame和tibble
  dat$var1 <- dat[[yvar]]
  dat$var2 <- factor(dat[[xvar]])

  dunn_stat <- dat %>% dunn_test(var1 ~ var2, p.adjust.method = "hochberg")
  dunn_stat <- dunn_stat %>% add_xy_position(x = "var2")
  dunn_stat$p.adj.sci <- format(dunn_stat$p.adj, scientific = TRUE, digits = 3)
  print(dunn_stat)
  
  plot <- ggplot(dat, mapping = aes(x = var2, y = var1, fill = var1)) +
    geom_boxplot() +
    stat_compare_means(method = "kruskal.test", label.y = 45, hjust = 0.5) +
    stat_pvalue_manual(dunn_stat, label = "p.adj.sci", hide.ns = FALSE, inherit.aes = FALSE,
                       size = 3, step.increase = 0.05) +
    labs(x = xvar, y = yvar)
  return(plot)
}

方式2:用dplyr::mutate创建列(更符合tidyverse风格)

用mutate结合.data pronoun来创建新列,避免直接修改原数据框的列:

plot_w_dunn <- function(dat, xvar, yvar) {
  require("dplyr")
  # 用mutate创建新列,兼容所有tidyverse数据结构
  dat <- dat %>%
    mutate(var1 = .data[[yvar]],
           var2 = factor(.data[[xvar]]))

  dunn_stat <- dat %>% dunn_test(var1 ~ var2, p.adjust.method = "hochberg")
  dunn_stat <- dunn_stat %>% add_xy_position(x = "var2")
  dunn_stat$p.adj.sci <- format(dunn_stat$p.adj, scientific = TRUE, digits = 3)
  print(dunn_stat)
  
  plot <- ggplot(dat, mapping = aes(x = var2, y = var1, fill = var1)) +
    geom_boxplot() +
    stat_compare_means(method = "kruskal.test", label.y = 45, hjust = 0.5) +
    stat_pvalue_manual(dunn_stat, label = "p.adj.sci", hide.ns = FALSE, inherit.aes = FALSE,
                       size = 3, step.increase = 0.05) +
    labs(x = xvar, y = yvar)
  return(plot)
}

测试验证

修改后调用tibble数据即可正常运行:

plot_w_dunn(as_tibble(mtcars), "cyl", "mpg") # 正常运行
plot_w_dunn(mtcars, "cyl", "mpg") # 依然正常运行

内容的提问来源于stack exchange,提问作者Juan Manuel Schvartzman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:48:22