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

在R中基于首列变量对多列执行wilcox.test并添加p值与校正p值

问题解决:为分组变量添加Wilcoxon检验p值及BH校正值

先看原始数据:

df <- data.frame(
      variable=c(2.4860651, -0.68863024, 2.63530974, -2.95754943, 1.67945091, 2.63530974,
           4.79002539, 2.32575938, 3.57236441, -0.364825998, -2.00646016, -3.12380516, 
           0.69307013, -5.65846824, 0.45632519, 2.08978142),
      A=c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
      B=c(1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0),
      C=c(0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1),
      D=c(1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0),
      E=c(0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
      F=c(0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1))

需求是:对A到F的每一列,用该列的0/1分组,对variable列做Wilcoxon秩和检验,然后在原数据底部添加两行——第一行是各列的检验p值,第二行是BH校正后的p值。

你之前的代码报错,核心问题有两个:一是wilcox.test的公式写反了(应该是variable ~ .x,而非.x ~ variable);二是处理p值校正时的结构逻辑错误,直接对整个data.frame用p.adjust会导致格式混乱,后续行绑定和变量替换也有问题。

以下是修正后的可运行代码:

library(dplyr)

# 1. 计算每列的Wilcoxon检验p值
p_vals <- df %>% 
  summarise(across(!variable, ~wilcox.test(variable ~ .x, exact = NULL)$p.value))

# 2. 对p值做BH校正,转换为和p_vals一致的data.frame格式
p_adjusted <- p.adjust(unlist(p_vals), method = "BH") %>% 
  t() %>% 
  as.data.frame() %>% 
  setNames(names(p_vals))

# 3. 将p值、校正p值行添加到原数据,并设置对应标签
result <- df %>% 
  bind_rows(
    mutate(p_vals, variable = "p.value"),
    mutate(p_adjusted, variable = "p.adjust")
  )

运行后得到的结果完全符合你的预期:比如列A因分组样本量过小,p值和校正值均为1;其他列的p值和校正结果也与你给出的示例匹配。

内容的提问来源于stack exchange,提问作者Sylvia Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:05:28