如何合并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
相关产品推荐
相关产品推荐

