批量对多列执行Fisher精确检验的R代码实现需求
批量执行Fisher精确检验的R代码方案
数据集
提供的数据集如下:
df<-data.frame(ID=c(1:5),P1=c("A","A","A","B","B"),P2=c("T","T","C","N","R"),P3=c("G","G","G","B","B"),A1=c("Present","Present","Present","absent","absent"), B1=c("absent","Present","Present","absent","absent"),C1=c("absent","absent","Present","absent","absent") ) df
需求
需批量验证以下变量对的关联并执行Fisher精确检验:
- P1分别与A1、B1、C1
- P2分别与A1、B1、C1
- P3分别与A1、B1、C1
单组检验示例代码:
fisher<-with(df, table(P1, A1)) fisher fisher_test(fisher)
批量实现方案
以下提供两种高效的批量处理方案,适配大规模数据集:
方案1:基础R循环实现
# 定义分组变量(P开头)和结果变量(A/B/C1) group_vars <- c("P1", "P2", "P3") result_vars <- c("A1", "B1", "C1") # 创建空列表存储检验结果 fisher_results <- list() # 双重循环遍历所有变量对 for (group in group_vars) { for (result in result_vars) { # 生成列联表 tab <- table(df[[group]], df[[result]]) # 执行Fisher精确检验(若使用rstatix包的fisher_test,替换fisher.test即可) test_res <- fisher.test(tab) # 以"分组变量-结果变量"为名称存储结果 fisher_results[[paste(group, result, sep = "-")]] <- test_res } } # 查看完整检验结果 fisher_results # 提取关键指标生成结构化表格 result_summary <- do.call(rbind, lapply(fisher_results, function(res) { data.frame( p_value = res$p.value, odds_ratio = res$estimate, conf_low = res$conf.int[1], conf_high = res$conf.int[2] ) })) rownames(result_summary) <- names(fisher_results) result_summary
方案2:tidyverse风格实现(更简洁)
依赖tidyverse和broom包实现整洁化批量处理:
library(tidyverse) library(broom) # 生成所有变量对组合 var_combinations <- crossing(group_var = group_vars, result_var = result_vars) # 批量执行检验并整理结果 tidy_fisher_results <- var_combinations %>% mutate( # 生成对应列联表 contingency_table = map2(group_var, result_var, ~table(df[[.x]], df[[.y]])), # 执行检验并转换为整洁数据框 test_output = map(contingency_table, ~broom::tidy(fisher.test(.x))) ) %>% unnest(test_output) %>% select(-contingency_table) # 按需保留列联表列 # 查看整理后的结构化结果 tidy_fisher_results
注意事项
- 若使用示例中的
fisher_test(rstatix包函数),只需将代码中的fisher.test替换为fisher_test即可。 - 若部分列联表不满足检验条件(如单元格全为0),代码会自动抛出提示,可根据实际情况调整变量筛选逻辑。
内容的提问来源于stack exchange,提问作者Marwah Al-kaabi
相关产品推荐
相关产品推荐

