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

使用rstatix在循环中执行Wilcoxon检验时遇列不存在问题

解决rstatix中wilcox_test循环调用的列不存在问题

问题背景

现有如下R数据框:

library(rstatix)
grp1 <- runif(10, min = 0, max = 100)  # 数值型示例数据
grp2 <- runif(10, min = 0, max = 100)
grp3 <- runif(10, min = 0, max = 100)
grp4 <- runif(10, min = 0, max = 100)
status <- sample(c("alive", "death", "sick"), 10, replace = TRUE)  # 字符型分组数据

my_data_frame <- data.frame(grp1, grp2, grp3, grp4, status)

需求是对每个grp列(grp1~grp4)执行如下 Wilcoxon 检验:

wilcox_test(grp1~ status, p.adjust.method = "fdr")

尝试了以下循环代码,但报错提示Column var[i] doesn't exist:

for (i in 4) {
 
  var <- names(my_data_frame)
  test <- my_data_frame %>% wilcox_test(var[i] ~ status, p.adjust.method = "fdr")
}

错误原因

wilcox_test的公式参数需要传入公式对象,而不是字符串列名。直接在公式中使用var[i]这种字符串时,函数会将其当作列名去数据框中查找,而数据框里不存在名为var[i]的列,因此报错。

解决方法

方法1:for循环+构造公式对象

遍历目标列名,用as.formula()将字符串转换为公式对象:

library(dplyr)

# 初始化列表存储结果
test_results <- list()
# 获取所有grp开头的列名
grp_columns <- names(my_data_frame)[startsWith(names(my_data_frame), "grp")]

for (col_name in grp_columns) {
  # 动态构造公式
  test_formula <- as.formula(paste(col_name, "~ status"))
  # 执行检验并保存结果
  test_results[[col_name]] <- my_data_frame %>%
    wilcox_test(formula = test_formula, p.adjust.method = "fdr")
}

# 查看所有结果
test_results

方法2:用purrr::map批量处理(tidyverse风格)

借助purrr包的map函数,批量遍历列名并执行检验:

library(purrr)

grp_columns <- names(my_data_frame)[startsWith(names(my_data_frame), "grp")]

# 批量执行检验
test_results_map <- map(grp_columns, function(col) {
  my_data_frame %>%
    wilcox_test(as.formula(paste(col, "~ status")), p.adjust.method = "fdr")
})

# 给结果列表命名,方便查看
names(test_results_map) <- grp_columns

方法3:转长格式后分组检验(推荐)

将宽格式数据转为长格式,再按分组列批量执行检验,更符合tidy数据原则:

library(tidyr)

# 转长格式:将所有grp列合并为一列,保留分组信息
my_data_long <- my_data_frame %>%
  pivot_longer(cols = starts_with("grp"), 
               names_to = "group_name", 
               values_to = "value")

# 按group_name分组执行检验
test_results_long <- my_data_long %>%
  group_by(group_name) %>%
  wilcox_test(value ~ status, p.adjust.method = "fdr")

# 查看结果
test_results_long

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:26:25