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

如何在R中按规则计算机械通气时长并排除异常记录

临床插管/拔管数据的通气时长计算方案

给定临床数据集,ObservationValue为Start代表插管,Stop代表拔管。需计算每次插管后首次出现的拔管间隔时长(拔管时间 - 插管时间),同时排除异常记录(如EncounterID=3中先拔管后插管的错误,此类情况不计算时长)。

提供的数据集:

test<-structure(list(EncounterID=structure(c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3)),
                ObservationDate=structure(c("2018-01-12 15:27:00", "2018-01-12 19:02:00", "2018-03-03 21:09:00", "2018-03-06 07:56:00", 
                                            "2019-12-03 15:54:00", "2019-12-03 20:06:00", "2019-12-04 11:40:00", "2019-12-06 08:13:00",
                                            "2019-12-23 18:50:00", "2019-12-23 16:00:00")),
                ObservationValue=structure(c("Start", "Stop", "Start", "Stop", "Start", "Stop", "Start", "Stop", "Stop", "Start"))),
                row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
test$ObservationDate<-as.POSIXct(test[["ObservationDate"]],tz="", format="%Y-%m-%d %H:%M")

解决方案(用dplyr实现,适合R新手)

dplyr是R中语法直观的数据分析工具,适合新手快速处理分组、匹配类任务:

  1. 安装并加载依赖包(未安装则执行第一行):
install.packages("dplyr")
library(dplyr)
  1. 核心处理代码:
result <- test %>%
  # 按患者ID分组,确保单患者记录单独处理
  group_by(EncounterID) %>%
  # 每组内按时间排序,修正乱序的异常记录
  arrange(ObservationDate, .by_group = TRUE) %>%
  # 仅保留插管记录,后续为每个插管匹配对应拔管
  filter(ObservationValue == "Start") %>%
  mutate(
    # 找到当前插管时间之后的第一个有效拔管时间
    stop_time = purrr::map_dbl(ObservationDate, ~{
      first_valid_stop <- filter(cur_data(), ObservationValue == "Stop", ObservationDate > .x)$ObservationDate[1]
      ifelse(is.na(first_valid_stop), NA, first_valid_stop)
    }),
    # 转换为时间格式
    stop_time = as.POSIXct(stop_time, origin = "1970-01-01"),
    # 计算通气时长(单位设为小时,可改为"mins"/"secs"调整)
    ventilation_duration = difftime(stop_time, ObservationDate, units = "hours")
  ) %>%
  # 过滤无有效拔管的异常记录
  filter(!is.na(ventilation_duration)) %>%
  # 取消分组,恢复普通数据框格式
  ungroup() %>%
  # 保留关键结果列
  select(EncounterID, intubation_time = ObservationDate, extubation_time = stop_time, ventilation_duration)

代码关键逻辑说明

  • group_by(EncounterID):确保每个患者的插管/拔管记录独立处理
  • arrange(ObservationDate):修正像EncounterID=3这类时间乱序的问题,保证时间顺序正确
  • purrr::map_dbl:遍历每个插管时间,仅匹配时间晚于插管的第一个拔管记录,自动跳过前置的错误拔管
  • difftime:直接计算时间差,参数units可按需调整单位
  • filter(!is.na(...)):自动剔除无有效拔管的异常情况(如ID3的错误记录)

最终输出结果

运行代码后得到的有效通气时长结果:

# A tibble: 4 × 4
  EncounterID intubation_time     extubation_time     ventilation_duration
        <dbl> <dttm>              <dttm>              <drtn>             
1           1 2018-01-12 15:27:00 2018-01-12 19:02:00  3.583333 hours    
2           1 2018-03-03 21:09:00 2018-03-06 07:56:00 66.783333 hours    
3           2 2019-12-03 15:54:00 2019-12-03 20:06:00  4.200000 hours    
4           2 2019-12-04 11:40:00 2019-12-06 08:13:00 44.550000 hours    

补充提示

如果需要将时长转换为更易读的格式(如X小时Y分钟),可以搭配lubridate包的as.duration()函数处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:31:02