如何在R中用purrr批量对数据框行与总观测值执行Fisher精确检验?
批量执行Fisher精确检验并添加P值列
准备工作
先加载所需的dplyr和purrr包,同时定义原始数据框:
library(dplyr) library(purrr) frequencies <- data.frame(row.names = c("a", "b", "c") ,response = c(10, 7, 4) ,no_response = c(12, 12, 7))
步骤1:计算总观测值
直接用colSums生成总观测值向量,无需转成数据框,更简洁:
total_vec <- colSums(frequencies)
步骤2:批量计算P值并合并到原数据框
这里提供两种符合purrr风格的实现方式:
方式1:用transpose() + map_dbl()
# 遍历每行生成P值向量 p_vals <- frequencies %>% transpose() %>% map_dbl(function(row) { # 构造2×2列联表:总观测值 + 当前行数据 contingency_table <- rbind(total_vec, unlist(row)) # 执行Fisher检验并提取P值 fisher.test(contingency_table)$p.value }) # 将P值列添加到原数据框 frequencies$pval <- p_vals
方式2:用rowwise() + mutate()(更直观)
frequencies <- frequencies %>% rowwise() %>% mutate(pval = fisher.test(rbind(total_vec, c(response, no_response)))$p.value) %>% ungroup()
最终输出结果
运行代码后,frequencies会更新为目标格式:
> frequencies # A tibble: 3 × 3 response no_response pval <dbl> <dbl> <dbl> 1 10 12 0.803 2 7 12 1 3 4 7 1
内容的提问来源于stack exchange,提问作者Wera
相关产品推荐
相关产品推荐

