如何让支持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
相关产品推荐
相关产品推荐

