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

R语言如何基于就诊记录数据集统计患病患者数及就诊次数种族差异

R医疗数据集统计需求实现方案

前置准备

首先加载tidyverse套件,包含你提到的group_by、summarize等函数,语法简单易读,处理千万级数据性能也足够:

library(tidyverse)
# 先把你的示例数据赋值给df,实际使用时替换为你的真实数据集导入代码即可
df <- structure(...) # 此处粘贴你给出的数据集结构代码即可

需求1:统计患过各疾病的患者总人数

核心逻辑是按患者ID分组,只要任意一次就诊某疾病标记为1,就判定为患过该疾病:

# 第一步:生成每个患者的患病状态表(1行/患者)
patient_base <- df %>%
  group_by(patient_id) %>%
  summarise(
    ever_A = max(diseaseA), # 只要有1次就诊为1,结果就是1
    ever_B = max(diseaseB),
    ever_C = max(diseaseC),
    raceeth = first(raceeth) # 患者种族固定,取任意一条记录的取值即可
  )

# 第二步:统计各疾病的患病人数
disease_total_patients <- patient_base %>%
  summarise(
    diseaseA_患病人数 = sum(ever_A),
    diseaseB_患病人数 = sum(ever_B),
    diseaseC_患病人数 = sum(ever_C)
  )

# 直接查看结果
print(disease_total_patients)

需求2:分疾病统计就诊次数+种族差异对比

2.1 计算每个患者对应疾病的总就诊次数

将宽表转成长表统一处理,避免重复写三次相同逻辑:

patient_visit_stats <- df %>%
  # 把三个疾病字段转为长格式,1行/患者/单次就诊/单疾病
  pivot_longer(
    cols = starts_with("disease"),
    names_to = "disease_type",
    values_to = "is_diagnosed"
  ) %>%
  group_by(patient_id, disease_type) %>%
  summarise(
    # 求和即为该患者因该疾病的总就诊次数
    total_visits = sum(is_diagnosed),
    .groups = "drop"
  ) %>%
  # 关联患者的患病标记,只保留确实患过该疾病的患者
  left_join(
    patient_base %>% 
      pivot_longer(
        cols = starts_with("ever_"),
        names_to = "disease_type",
        names_prefix = "ever_",
        values_to = "ever_had"
      ),
    by = c("patient_id", "disease_type")
  ) %>%
  filter(ever_had == 1)

2.2 分种族计算各疾病的平均就诊次数

race_visit_comparison <- patient_visit_stats %>%
  left_join(patient_base %>% select(patient_id, raceeth), by = "patient_id") %>%
  group_by(disease_type, raceeth) %>%
  summarise(
    群体患者数 = n(),
    次均就诊次数 = mean(total_visits),
    就诊次数标准差 = sd(total_visits),
    就诊次数中位数 = median(total_visits),
    .groups = "drop"
  )

# 查看对比结果
print(race_visit_comparison)

2.3 统计检验差异显著性

如果需要验证不同种族的平均就诊次数差异是否有统计学意义,可以用以下代码(以diseaseA为例):

# 提取diseaseA的患者数据
a_patient_data <- patient_visit_stats %>%
  filter(disease_type == "diseaseA") %>%
  left_join(patient_base %>% select(patient_id, raceeth), by = "patient_id")

# 若数据满足正态分布和方差齐性,用方差分析
aov_result <- aov(total_visits ~ raceeth, data = a_patient_data)
summary(aov_result)

# 若不满足正态分布,用非参数Kruskal-Wallis检验
kruskal_result <- kruskal.test(total_visits ~ raceeth, data = a_patient_data)
print(kruskal_result)

大数据量优化建议

如果900万条数据运行时内存不足,可以替换为data.table包实现相同逻辑,运行速度会提升3-5倍,内存占用也更低。

内容的提问来源于stack exchange,提问作者eliseabril

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:36:02