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

如何在R数据框中对多组向量对批量执行配对Wilcoxon符号秩检验

R批量配对Wilcoxon符号秩检验实现方案

报错原因说明

你原有代码的错误来自两个问题:

  • 遍历逻辑错误:for (a in variable.set1)实际遍历的是数据框的列向量数值,而不是列名,导致索引列时出现undefined columns selected报错
  • 检验逻辑错误:配对Wilcoxon检验针对的是同一样本、同一标志物的_MOM和_CB配对,不需要拆分组,也不需要做所有MOM和CB列的交叉检验

完整实现代码

该代码和你之前的秩和检验输出格式完全对齐,自动匹配配对标志物、计算P值、FDR校正,最终输出汇总表格:

# 加载所需包
library(tidyverse)
library(knitr)
library(kableExtra)
library(scales) # 用于scientific函数格式化科学计数法

# ----------------------
# 1. 数据预处理
# ----------------------
# 你原来的排除变量定义
excluded_vars <- toydata %>%
  select(CCBB_dyad_number, cCMV_status, maternal_CMV_IgM_status) %>%
  names()

# 仅保留cCMV+样本(如果需要全样本检验则去掉filter步骤即可)
toy_cCMV_pos <- toydata %>%
  filter(cCMV_status == 'cCMV+') 

# 提取所有MOM标志物列名,去掉后缀得到核心标志物名称,用于匹配对应的CB列
mom_col_names <- toy_cCMV_pos %>%
  select(ends_with("_MOM")) %>%
  names()
marker_core <- str_remove(mom_col_names, "_MOM$")

# ----------------------
# 2. 批量配对检验
# ----------------------
paired_wilcox_out <- lapply(marker_core, function(m){
  # 匹配对应的MOM和CB列名
  mom_col <- paste0(m, "_MOM")
  cb_col <- paste0(m, "_CB")
  
  # 执行配对Wilcoxon符号秩检验
  test_res <- wilcox.test(
    x = toy_cCMV_pos[[mom_col]],
    y = toy_cCMV_pos[[cb_col]],
    paired = TRUE,
    conf.int = TRUE # 可选,输出置信区间
  )
  
  # 整理结果为数据框
  as.data.frame(test_res) %>%
    mutate(
      Marker = m,
      P.value = scientific(p.value, digits = 2, format = "e")
    ) %>%
    select(
      Marker, 
      V.statistic = statistic, 
      P.value, 
      Method = method,
      conf.low, conf.high # 不需要置信区间可以删掉这两个
    )
}) %>%
  bind_rows()

# ----------------------
# 3. FDR校正 + 输出表格
# ----------------------
paired_wilcox_out$FDR_P.value <- p.adjust(
  paired_wilcox_out$P.value, 
  method = "fdr"
) %>% scientific(digits = 2, format = "e")

# 调整列顺序
paired_wilcox_out <- paired_wilcox_out[, c(
  "Marker", "V.statistic", "P.value", "FDR_P.value", "Method", "conf.low", "conf.high"
)]

# 输出美观表格
kable(paired_wilcox_out, "html", booktabs = T) %>%
  kable_styling(latex_options = c("striped", "scale_down"))

代码适配说明

  • 如果不需要限定cCMV+样本,直接把toy_cCMV_pos替换为原始的toydata即可
  • 如果不需要输出置信区间,删掉代码中对应conf.int、conf.low、conf.high的部分即可
  • 代码会自动匹配所有_MOM和_CB的配对标志物,78组数据直接运行即可,不需要手动修改配对逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:09:03