You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:15:41