按站点分组执行Wilcoxon双侧检验结果异常,求问题排查
问题排查与修正方案
你的核心问题出在**wilcox.test里指定了整个数据集data=data.frame**,而不是使用group_by后每个分组的子数据集。这就导致每个站点的检验其实都在跑全量数据,结果自然完全相同。另外还有两个小参数错误需要修正,下面一步步来:
1. 核心错误修正
在do()函数内部,wilcox.test默认会使用当前分组后的子数据,不需要手动指定data=data.frame。如果非要指定,应该用.或者.data(dplyr的内置变量,代表当前分组的数据)。
2. 参数错误修正
equal.var=FALSE是t.test的参数,Wilcoxon检验不需要这个,因为它是非参数检验,不依赖方差齐性假设,直接删掉即可。na.rm=TRUE不是wilcox.test的参数,要处理缺失值应该用na.action=na.omit,或者先在数据预处理阶段移除NA。
修正后的代码
方法一:使用dplyr::do()
library(dplyr) library(broom) t2 <- data.frame %>% group_by(Site) %>% do(tidy(wilcox.test(Conc ~ Scenario, data = ., na.action = na.omit)))
这里的.代表当前分组的子数据集,和.data效果一致。
方法二:更现代的nest() + map()(推荐)
dplyr现在更推荐用嵌套数据框的方式处理分组分析,代码更清晰易读:
library(dplyr) library(tidyr) library(purrr) library(broom) t2 <- data.frame %>% drop_na(Conc) %>% # 先移除缺失值,避免后续检验报错 nest(data = -Site) %>% # 按Site嵌套对应的数据 mutate(test_result = map(data, ~ tidy(wilcox.test(Conc ~ Scenario, data = .x)))) %>% unnest(test_result) %>% select(-data) # 移除不需要的嵌套数据列
验证结果
运行修正后的代码后,每个站点的statistic和p.value应该会根据各自的样本数据产生不同的结果,不再完全一致。
内容的提问来源于stack exchange,提问作者CatN
相关产品推荐
相关产品推荐

