如何在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中语法直观的数据分析工具,适合新手快速处理分组、匹配类任务:
- 安装并加载依赖包(未安装则执行第一行):
install.packages("dplyr") library(dplyr)
- 核心处理代码:
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
相关产品推荐
相关产品推荐

