如何将含重复患者ID的用药数据合并至现有R数据框?
合并患者用药记录并保持单行患者数据
问题背景
我正在分析医学数据,现有包含患者ID及实验室指标值的数据框df_1,以及包含患者用药信息的数据框df_2。部分患者存在多种用药记录(同一ID对应多条用药数据),需要将同一患者的用药合并为单个变量用于统计分析分组。尝试过assign()函数及各类连接函数,但结果都会增加行数,需要保持每行对应一位患者(如示例输出df_3所示),因为药物组合对研究用药对实验室指标的影响至关重要。
示例输入数据
df_1 <- data.frame(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9), Labvalues = c(54, 86, 21, 56, 75, 96, 45, 78, 95)) df_2 <- data.frame(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 3), Meds = c("A", "B", "C", "D", "E", "F", "A", "C", "G", "B", "G"))
期望输出
df_3 <- data.frame(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9), Labvalues = c(54, 86, 21, 56, 75, 96, 45, 78, 95), Meds = c("A;B", "B", "C;G", "D", "E", "F", "A", "C", "G"))
解决方案
方法1:Tidyverse工具链(dplyr + tidyr)
这是处理这类数据聚合最常用的方式,先聚合用药数据,再与实验室数据匹配:
library(dplyr) library(tidyr) # 聚合用药记录:同一ID的用药用分号拼接 df_2_agg <- df_2 %>% group_by(ID) %>% summarise(Meds = paste(Meds, collapse = ";"), .groups = "drop") # 左连接保证保留所有患者,且每行对应一位患者 df_3 <- df_1 %>% left_join(df_2_agg, by = "ID")
方法2:Base R(无需额外包)
如果不想加载第三方包,用base R的aggregate和merge也能实现:
# 聚合用药数据 df_2_agg <- aggregate(Meds ~ ID, data = df_2, FUN = function(x) paste(x, collapse = ";")) # 合并数据框,all.x=TRUE确保保留df_1的所有行 df_3 <- merge(df_1, df_2_agg, by = "ID", all.x = TRUE)
两种方法最终得到的df_3都完全符合期望的结构,既合并了同一患者的用药记录,又保持了每行对应一位患者的格式,不会增加行数。
内容的提问来源于stack exchange,提问作者bluelagune
相关产品推荐
相关产品推荐

