使用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
相关产品推荐
相关产品推荐

