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

在R中按分组对数据框各列执行配对样本Wilcoxon检验求助

在R语言中按分组对各列执行配对样本Wilcoxon检验

需求说明

将给定的数据框按Group(Group1和Group2)拆分后,针对每个微生物丰度列,以ID为配对依据,对Time(T0和T2)的配对数据执行配对样本Wilcoxon检验。

输入数据

df <- structure(list(ID = c(1L, 2L, 3L, 4L, 5L, 10L, 11L, 12L, 13L, 
14L, 1L, 2L, 3L, 4L, 5L, 10L, 11L, 12L, 13L, 14L), Group = c("Group1", 
"Group1", "Group1", "Group1", "Group1", "Group2", "Group2", "Group2", 
"Group2", "Group2", "Group1", "Group1", "Group1", "Group1", "Group1", 
"Group2", "Group2", "Group2", "Group2", "Group2"), Time = c("T0", 
"T0", "T0", "T0", "T0", "T0", "T0", "T0", "T0", "T0", "T2", "T2", 
"T2", "T2", "T2", "T2", "T2", "T2", "T2", "T2"), Alistipes_putredinis = c(20.54997, 
0, 0, 0, 0.00226, 0, 12.83106, 0.38555, 16.45834, 0, 0.6405, 
0, 0, 0, 0, 16.32105, 0, 0, 0, 0), Bidobacterium_l = c(14.43141, 
0.25318, 0.83121, 0.54282, 8.50687, 0.10432, 0.0051, 0.00139, 
0.11766, 0.57905, 0.74302, 0.79018, 0.20329, 5.34884, 1.75612, 
0.25502, 0, 0.60675, 0.59414, 0.85824), Dialister_invisus = c(12.45032, 
7.88459, 0.99032, 1.84241, 0.93828, 1.96771, 5.16734, 3.82884, 
1.55069, 0.97391, 1.43845, 9.77174, 2.59287, 4.70876, 2.30655, 
3.08246, 10.56866, 0.49946, 0.95196, 0.14022), Clostridia_bacterium = c(7.5127, 
0, 0, 0, 0, 6.65269, 0, 0, 4.11219, 0, 5.34908, 0.00794, 0, 0, 
0, 0, 0, 4.33676, 6.2422, 0), Ruminococcus_sp_NSJ_71 = c(6.57903, 
1.45815, 0.28668, 1.66816, 1.66008, 1.85348, 1.80051, 0.91537, 
3.12064, 3.00647, 2.91748, 1.97839, 0.0726, 3.7829, 1.59076, 
1.05453, 0.03881, 3.84824, 0.01241, 2.88977)), class = "data.frame", row.names = c(NA, 
-20L))

解决方案

方法1:使用tidyverse包(简洁易读)

# 加载tidyverse包
library(tidyverse)

# 将宽格式数据转为长格式,方便分组处理
long_df <- df %>%
  pivot_longer(
    cols = -c(ID, Group, Time),  # 排除非丰度列
    names_to = "Microbe",        # 微生物名称列
    values_to = "Abundance"      # 丰度值列
  )

# 按Group和Microbe分组,执行配对Wilcoxon检验
wilcox_results <- long_df %>%
  group_by(Group, Microbe) %>%
  summarise(
    wilcox_stat = wilcox.test(Abundance ~ Time, paired = TRUE)$statistic,
    p_value = wilcox.test(Abundance ~ Time, paired = TRUE)$p.value,
    .groups = "drop"
  )

# 输出结果
print(wilcox_results)

方法2:使用Base R(无需额外加载包)

# 按Group拆分数据框
group_data <- split(df, df$Group)

# 定义检验函数:对单个分组的所有丰度列执行配对Wilcoxon检验
run_paired_wilcox <- function(group_df) {
  # 获取需要检验的丰度列名
  target_cols <- setdiff(names(group_df), c("ID", "Group", "Time"))
  
  # 遍历每列执行检验
  result_list <- lapply(target_cols, function(col) {
    # 提取T0和T2的配对数据
    t0_data <- group_df[group_df$Time == "T0", col]
    t2_data <- group_df[group_df$Time == "T2", col]
    
    # 执行配对Wilcoxon检验
    test_result <- wilcox.test(t0_data, t2_data, paired = TRUE)
    
    # 整理结果为数据框
    data.frame(
      Microbe = col,
      wilcox_stat = test_result$statistic,
      p_value = test_result$p.value
    )
  })
  
  # 合并所有列的结果
  do.call(rbind, result_list)
}

# 对两个分组分别执行检验
group1_results <- run_paired_wilcox(group_data$Group1)
group2_results <- run_paired_wilcox(group_data$Group2)

# 查看结果
cat("Group1检验结果:\n")
print(group1_results)
cat("\nGroup2检验结果:\n")
print(group2_results)

结果说明

两种方法都会输出每个分组下,各微生物丰度列的Wilcoxon检验统计量和p值,可用于判断T0和T2时间点的丰度是否存在显著差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:39:57