如何在R中用coalesce合并ICU患者时间序列数据集同时间点多行数据
错误原因
你代码的核心问题出在内层循环的索引逻辑:你调用Patient_full[j + 1,]时取的是全局数据集的行,而非当前时间点分组veri_group内的行,当j的取值超过当前分组的行数时就会报错,即使不报错,取到的也是其他时间点的无效数据,和你的预期逻辑完全不符。
另外这种长表按时间点合并为宽表的需求是R结构化数据处理的典型场景,完全不需要手动写嵌套循环,内置的向量化方法性能更高、出错概率更低。
推荐解决方案(tidyverse实现,和你原有coalesce逻辑完全一致)
先确保你已经安装加载tidyverse包,代码如下:
library(tidyverse) patient_obs_final <- Patient_full %>% # 按时间点分组 group_by(Time) %>% # 对所有列,取当前组内第一个非NA的值,相当于你原来循环用coalesce合并的效果 summarise(across(everything(), ~first(na.omit(.x)))) %>% # 取消分组,方便后续分析 ungroup()
如果你的数据量较大(比如超过10万行),可以用data.table实现,性能更好:
library(data.table) setDT(Patient_full) patient_obs_final <- Patient_full[, lapply(.SD, function(x) first(na.omit(x))), by = Time]
原有循环的修复版本(不推荐使用,仅作逻辑参考)
如果你确实要保留循环结构,可以修改内层循环的取数范围,仅从当前时间点的分组内取行:
Patient_full$Verification_group <- as.numeric(as.factor(Patient_full$Time)) observation_times <- max(Patient_full$Verification_group) # 初始化空结果表,避免第一行重复 patient_obs_final <- data.frame() for (i in 1 : observation_times) { veri_group <- filter(Patient_full, Verification_group == i) obs_at_timepoint <- veri_group[1, ] # 仅遍历当前分组内的行 for (j in 2:nrow(veri_group)) { obs_at_timepoint <- coalesce(obs_at_timepoint, veri_group[j,]) } patient_obs_final <- rbind(patient_obs_final, obs_at_timepoint) }
内容的提问来源于stack exchange,提问作者for_the_love_of_cod
相关产品推荐
相关产品推荐

