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

如何将含重复患者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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:55:23