如何在R中合并两个数据库并为重复项自动创建新列?
在R中实现患者数据与耗材数据的宽格式合并
步骤1:构造示例数据
先将你提供的示例数据转换成R可处理的数据框:
# 数据库1:患者基础信息 db1 <- data.frame( PatientID = c(1, 2, 3, 4, 5, 5), Gender = c("Male", "Male", "Female", "Female", "Female", "Male"), Age = c(65, 77, 88, 83, 81, 88) ) # 数据库2:手术耗材使用记录 db2 <- data.frame( PatientID = c(1, 1, 1, 2, 2, 3, 3, 3), Material = c("A", "B", "C", "A", "B", "A", "B", "C") )
步骤2:将耗材数据转换为宽格式
数据库2是长格式(同一患者对应多行耗材记录),需要先转成宽格式,自动生成Material1、Material2这类带序号的列。推荐用tidyverse工具链实现:
library(tidyverse) # 为每个患者的耗材记录添加序号后缀,再转宽表 db2_wide <- db2 %>% group_by(PatientID) %>% mutate(material_col = paste0("Material", row_number())) %>% pivot_wider(names_from = material_col, values_from = Material) %>% ungroup()
如果你的数据量较大,也可以用data.table实现更高效的转换:
library(data.table) setDT(db2) # 直接用dcast转换,rowid生成序号 db2_wide_dt <- dcast(db2, PatientID ~ paste0("Material", rowid(PatientID)), value.var = "Material")
步骤3:合并两个数据库
用左连接(保留数据库1的所有患者记录)将转换后的耗材宽表与患者信息表合并:
# tidyverse方式 merged_data <- db1 %>% left_join(db2_wide, by = "PatientID") # data.table方式 setDT(db1) merged_data_dt <- merge(db1, db2_wide_dt, by = "PatientID", all.x = TRUE)
为什么直接用merge函数不行?
merge()仅能按指定键(比如PatientID)匹配合并行,无法自动处理长格式转宽格式的需求。必须先把数据库2的重复行转成多列,再执行合并操作。
内容的提问来源于stack exchange,提问作者A McK
相关产品推荐
相关产品推荐

