如何在group_by管道中按Material分组执行Wilcoxon/t检验?
问题分析与解决
你的错误根源是Wilcoxon检验的公式写法用错了:Filtered~Unfiltered的格式要求右侧是二分类分组因子(比如Condition这种只有2个水平的变量),但你传入的Unfiltered是连续数值列,R会把它强行转成因子,自然不满足“恰好2个水平”的要求,因此报错。
结合你的数据特点(每个Rep对应同一Material的两种处理,属于配对样本),以下两种方法都能解决问题:
方法1:基于宽格式的配对Wilcoxon检验
因为你的tempdf2是宽格式,每个行对应同一重复的两种处理结果,适合用配对Wilcoxon检验(比非配对检验更精准),修改summarize里的检验代码即可:
tempdf2 <- tempdf1 %>% tidyr::pivot_wider(id_cols=c(Material,Rep),names_from=Condition,values_from=Measurement) tempdf2 %>% dplyr::group_by(Material) %>% dplyr::summarize( wilcox_p_value = wilcox.test(Filtered, Unfiltered, paired = TRUE)$p.value )
运行后输出:
# A tibble: 2 × 2 Material wilcox_p_value <chr> <dbl> 1 Bromine 0.107 2 Carbonate 0.107
方法2:回到长格式做分组检验
如果你更习惯用公式格式(或者后续需要扩展分析),可以直接基于原始长格式tempdf1分组,以Condition为分组因子做检验:
tempdf1 %>% dplyr::group_by(Material) %>% dplyr::summarize( wilcox_p_value = wilcox.test(Measurement ~ Condition, paired = TRUE)$p.value )
这个方法不需要重构宽格式,直接利用原始数据的结构,Measurement ~ Condition表示以Condition(Filtered/Unfiltered)为分组,对比Measurement的差异,同时指定paired=TRUE(因为每个Rep是配对样本),结果和方法1完全一致。
关键说明
- 为什么用
paired=TRUE:你的数据中每个Rep是同一样本的两种处理(过滤/未过滤),属于配对设计,配对检验能控制重复带来的变异,比非配对检验更合适。 - 如果确实需要非配对检验(比如你的重复不是配对的),只需把
paired=TRUE改成paired=FALSE即可,但从你的数据结构看,配对检验更合理。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

