R语言如何使用purrr包逐行批量运行prop.test检验
R语言基于purrr实现逐行两两比例检验方案
核心思路
- 从宽表列名中自动提取所有地区名称,生成无重复的两两地区配对组合,避免重复检验相同配对
- 借助
purrr的映射函数逐行遍历原始数据框,对每行的所有配对依次执行prop.test - 提取检验p值、组间比例等核心结果,整理为结构化的长表方便后续分析
完整代码
首先加载依赖包,示例数据可直接复用提供的df1:
library(tidyverse) # 示例数据 df1 <- data.frame( id_val = c('row1', 'row2', 'row3'), value_florida = c(10, 27, 16), value_illinois = c(17, 14, 22), value_vermont = c(11, 4, 29), base_florida = c(12, 44, 32), base_illinois = c(18, 29, 23), base_vermont = c(15, 8, 33) ) # 1. 提取所有地区名称,生成不重复的两两配对 regions <- str_subset(colnames(df1), "^value_") |> str_remove("^value_") region_pairs <- combn(regions, 2, simplify = FALSE) # 2. 定义单行数据的检验函数:输入单行数据、配对列表,返回该行所有配对的检验结果 calc_single_row <- function(row_data, pairs) { map_dfr(pairs, function(pair) { # 提取两个地区的成功数(value)和样本量(base) x1 <- row_data[[paste0("value_", pair[1])]] n1 <- row_data[[paste0("base_", pair[1])]] x2 <- row_data[[paste0("value_", pair[2])]] n2 <- row_data[[paste0("base_", pair[2])]] # 执行比例检验 test_res <- prop.test(x = c(x1, x2), n = c(n1, n2)) # 整理结果输出 tibble( region_a = pair[1], region_b = pair[2], prop_a = x1 / n1, prop_b = x2 / n2, diff_prop = (x1/n1) - (x2/n2), p_value = test_res$p.value ) }) } # 3. 逐行遍历原数据,拼接所有检验结果 final_result <- df1 |> pmap_dfr(function(...) { current_row <- tibble(...) bind_cols( id_val = current_row$id_val, calc_single_row(current_row, region_pairs) ) })
使用说明
- 运行后
final_result为结构化长表,每一行对应一个原始行id下的一组配对检验结果,和手动计算的第一行佛罗里达-伊利诺伊配对p值完全一致,可直接验证 - 若需要关闭prop.test默认的连续性校正,只需在
prop.test()参数中添加correct = FALSE即可 - 若后续新增其他地区的
value_xxx、base_xxx列,代码无需手动调整配对逻辑,会自动识别新地区生成配对 - 如需添加显著性标记,可追加
mutate()步骤自定义标记规则,例如:
final_result <- final_result |> mutate( sig_label = case_when( p_value < 0.001 ~ "***", p_value < 0.01 ~ "**", p_value < 0.05 ~ "*", TRUE ~ "ns" ) )
内容的提问来源于stack exchange,提问作者Natasha R.
相关产品推荐
相关产品推荐

