在R中计算两组绝对差异及95%置信区间并写入指定列
R中计算两组比例差异及95%置信区间并写入数据框
问题说明
需针对数据框每行的Men组与Women组数据,计算比例的绝对差异及其95%置信区间,并将结果写入Absolute.difference_95CI列。
原始数据
data <- read.table(text=" Variable Men Women Absolute.difference_95CI n 979488 317716 NA Family.history.of.smoking 222153 79810 Prior.MI 500340 166528 Peripheral.vascular.disease 128795 50008 Cerebrovascular.disease 173112 76815 ", header=T, sep="\t")
原始代码问题分析
原代码存在3个核心错误:
- 循环未按行提取当前行的
Men和Women值,而是直接调用整列数据 - 变量名错误:
me和we未定义,应为当前行的Men、Women数值 - 赋值时未指定对应行,会直接覆盖整列结果
修正后的代码
方法1:基础for循环实现
data2 <- data # 遍历每一行数据 for(i in 1:nrow(data2)) { # 跳过总样本数行(无需计算差异) if(data2$Variable[i] == "n") { next } # 提取当前行的病例数及总样本量 men_case <- data2$Men[i] women_case <- data2$Women[i] men_total <- data2$Men[1] women_total <- data2$Women[1] # 执行比例差异置信区间计算 prop_result <- prop.test( x = c(men_case, women_case), n = c(men_total, women_total), correct = FALSE ) # 格式化结果并写入对应行 diff_val <- round(prop_result$estimate[1] - prop_result$estimate[2], 3) ci_low <- round(prop_result$conf.int[1], 3) ci_high <- round(prop_result$conf.int[2], 3) data2$Absolute.difference_95CI[i] <- paste0(diff_val, " (", ci_low, "-", ci_high, ")") } # 查看最终结果 print(data2)
方法2:dplyr向量化实现(更简洁)
若习惯使用tidyverse工具链,可通过rowwise()实现按行计算:
library(dplyr) data3 <- data %>% rowwise() %>% mutate( Absolute.difference_95CI = if_else( Variable == "n", NA_character_, { # 提取总样本量 total_men <- first(Men) total_women <- first(Women) # 计算比例差异及置信区间 res <- prop.test(x = c(Men, Women), n = c(total_men, total_women), correct = FALSE) # 格式化输出文本 paste0( round(res$estimate[1] - res$estimate[2], 3), " (", round(res$conf.int[1], 3), "-", round(res$conf.int[2], 3), ")" ) } ) ) %>% ungroup() # 查看结果 print(data3)
关键说明
- 第一行是总样本量,无需计算差异,直接保留NA
prop.test()中的correct=FALSE表示不使用连续性校正,若需校正可改为TRUE- 结果格式统一为
差异值 (置信区间下限-置信区间上限),保留3位小数
内容的提问来源于stack exchange,提问作者Mohamed Rahouma
相关产品推荐
相关产品推荐

