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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:05:36