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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:14:58