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

如何合并DataFrame中Patient ID与Date均匹配的行

解决方案

假设你的DataFrame结构如下(示例数据):

library(dplyr)

# 构造示例数据
df <- tibble(
  `Patient ID` = c("P001", "P001", "P001", "P002", "P002"),
  Date = as.POSIXct(c("2024-01-01 09:00", "2024-01-01 09:00", "2024-01-02 10:00", "2024-01-01 14:00", "2024-01-01 14:00")),
  b = c(12, NA, NA, NA, 34),
  a = c(NA, 5.6, NA, 7.8, NA),
  c = c(NA, NA, 90, NA, NA),
  d = c(NA, NA, NA, 100, NA)
)

方法1:使用dplyr包

核心思路是按Patient ID和Date分组,对每个检测列提取非NA值(每个分组内每个列仅存在一个非NA值):

df_merged <- df %>%
  group_by(`Patient ID`, Date) %>%
  summarise(across(c(b, a, c, d), ~ first(na.omit(.x))), .groups = "drop")
  • across(c(b,a,c,d)) 指定要处理的检测列,也可以用across(everything())自动处理所有非分组列
  • first(na.omit(.x)) 提取分组内该列的非NA值
  • .groups = "drop" 取消分组状态,返回普通DataFrame

方法2:使用data.table包

如果数据量较大,data.table的运行效率更高:

library(data.table)
setDT(df)
df_merged <- df[, lapply(.SD, function(x) x[!is.na(x)]), by = .(`Patient ID`, Date)]
  • .SD 代表分组后的子数据集,lapply(.SD, ...) 对每个列应用提取非NA值的函数
  • by = .(Patient ID, Date) 指定分组依据

方法3:Base R 原生方法

无需额外安装包,用aggregate函数即可实现:

df_merged <- aggregate(. ~ `Patient ID` + Date, data = df, FUN = function(x) x[!is.na(x)])
  • . ~ Patient ID + Date 表示按两列分组,处理其余所有列
  • 自定义FUN函数提取每个列的非NA值

以上三种方法都能实现需求:将同一Patient ID和Date组合的多行数据合并为一行,填充所有检测指标的有效数值。

内容的提问来源于stack exchange,提问作者raffaelluca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 19:12:20