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
相关产品推荐
相关产品推荐

