使用dplyr连接多张表:医疗患者BCR_ABL监测数据处理
使用dplyr连接多张医疗患者监测数据表的方法
场景说明
你提到的是单例患者(ID: Hospital1_124)的BCR_ABL随时间变化监测数据,实际医疗数据处理中,我们通常会关联多张表(比如患者基础信息表、检测实验室信息表等)来整合完整的诊疗视角。下面我结合这个示例场景,一步步演示用dplyr做表连接的常用操作。
先准备示例关联表
假设我们有三张核心表,先模拟生成符合逻辑的示例数据:
library(dplyr) # 1. 患者基础信息表:存储患者核心身份信息 patient_info <- tibble( PatientId = c("Hospital1_124"), PatientName = c("John Doe"), AdmissionDate = c("2007-10-05") ) # 2. BCR_ABL检测数据表:你提供的单例患者时间序列数据(补全模拟数值) bcr_abl_data <- tibble( PatientId = c("Hospital1_124", "Hospital1_124", "Hospital1_124", "Hospital1_124", "Hospital1_124", "Hospital1_124", "Hospital1_124"), TestDate = c("2007-11-13", "2008-09-01", "2011-02-24", "2013-05-01", "2016-02-16", "2017-05-12", "2017-08-29"), BCR_ABL = c(0.8, 0.3, 0.1, 0.05, 0.02, 0.01, 0.005) ) # 3. 检测实验室信息表:存储每次检测的实验室归属 lab_info <- tibble( TestDate = c("2007-11-13", "2008-09-01", "2011-02-24", "2013-05-01", "2016-02-16", "2017-05-12", "2017-08-29"), LabId = c("Lab001", "Lab001", "Lab002", "Lab002", "Lab003", "Lab003", "Lab003"), LabName = c("Central Hospital Lab", "Central Hospital Lab", "City Diagnostic Center", "City Diagnostic Center", "Regional Reference Lab", "Regional Reference Lab", "Regional Reference Lab") )
常用的dplyr表连接操作
1. 内连接(Inner Join)
只保留所有表中匹配的记录,适合获取"患者-检测-实验室"三者完全对应的有效数据:
# 先关联患者信息和检测数据,再关联实验室信息 inner_joined_data <- patient_info %>% inner_join(bcr_abl_data, by = "PatientId") %>% inner_join(lab_info, by = "TestDate")
2. 左连接(Left Join)
保留左表的所有记录,匹配右表的对应数据,适合确保不丢失患者的任何检测记录(即使某些检测没有关联实验室数据):
# 以检测数据表为核心,关联患者和实验室信息 left_joined_data <- bcr_abl_data %>% left_join(patient_info, by = "PatientId") %>% left_join(lab_info, by = "TestDate")
3. 全连接(Full Join)
保留所有表的所有记录,适合整合所有可能的数据(比如存在患者没有检测记录、或者检测记录没有对应患者的情况):
full_joined_data <- patient_info %>% full_join(bcr_abl_data, by = "PatientId") %>% full_join(lab_info, by = "TestDate")
针对时间序列监测数据的额外处理
连接完成后,还可以针对BCR_ABL的时间特性做进一步分析,比如排序、计算变化趋势:
# 转换日期格式并排序,计算BCR_ABL的变化率 analyzed_data <- left_joined_data %>% mutate(TestDate = as.Date(TestDate), AdmissionDate = as.Date(AdmissionDate)) %>% arrange(TestDate) %>% mutate(BCR_ABL_Delta = BCR_ABL - lag(BCR_ABL), BCR_ABL_Pct_Change = (BCR_ABL_Delta / lag(BCR_ABL)) * 100)
关键注意事项
- 确保连接键(比如
PatientId、TestDate)的数据类型一致:比如日期字段一定要统一转换为Date类型,避免因字符串格式差异导致匹配失败。 - 如果存在重复的连接键记录,先通过
distinct()去重,或者明确连接逻辑,避免生成冗余数据行。
内容的提问来源于stack exchange,提问作者Dhiraj
相关产品推荐
相关产品推荐

