如何对R数据框多列循环运行TukeyHSD检验并筛选校正p值<0.07的结果
R语言循环执行TukeyHSD检验并筛选显著列的解决方案
错误原因
TukeyHSD()返回的是多层列表结构,校正后p值所在的p adj列嵌套在$treatment子项中,直接调用tukey[["p adj"]]无法取到对应值,因此返回空值触发报错。
修改后可运行代码
模拟数据复用你提供的版本:
df1 <- data.frame(cmpd1 = c(500,436,1,1,1,1), cmpd2 = c(1,1,1,1,1,253), cmpd3 = c(1,1,300,57,150,260), treatment=c("W","W","A","A","D","D"))
循环执行TukeyHSD并筛选符合条件列的代码:
# 循环遍历所有数值列,350列场景可把1:3替换为1:(ncol(df1)-1)自动适配 for (i in 1:3){ column <- names(df1[i]) anova_fit <- aov(df1[,i] ~ treatment, data = df1) tukey_res <- TukeyHSD(anova_fit) # 提取处理组比较的所有校正p值,判断是否存在任意小于0.07的结果 p_adj_vec <- tukey_res$treatment[,"p adj"] if(any(p_adj_vec < 0.07, na.rm = TRUE)) { # 匹配你要求的输出格式 cat("$", column, "\n", sep = "") print(tukey_res$treatment) cat("\n") } }
逻辑说明
- 从
TukeyHSD返回结果中提取$treatment子项,即可获得所有处理组两两比较的结果矩阵,包含差异值、上下置信区间、校正p值4列 - 用
any()函数判断当前列的所有两两比较校正p值中,是否存在至少一个符合阈值的结果,满足条件才输出对应列的检验结果 - 加入
na.rm = TRUE参数避免极端场景下p值为NA导致的报错
内容的提问来源于stack exchange,提问作者millie0725
相关产品推荐
相关产品推荐

