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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:36:03