首页 > 解决方案 > 在多个观测值的移动 48 小时窗口内增加大于 0.3

问题描述

我有一个医院记录数据集,必须检查个别患者,如果“肌酐”在 48 小时内增加 >= 0.3,如果增加 >= 0.3,则在该时间点见证了增加。我的问题是,48 小时间隔必须从记录的开头移动到结尾,因为每个间隔都可能发生增加。

例子:

dat = data.table(
  patient_id=c(rep(1,7),rep(2,5)),
  measurement=c("1","2","3","4","5","6","7","1","2","3","4","5"),
  t=c("2019-01-19 05:00","2019-01-19 14:00","2019-01-20 05:00","2019-01-20 15:00","2019-01-21 03:00","2019-01-22 05:00","2019-01-23 05:00","2019-01-19 05:00","2019-01-19 14:00","2019-01-20 05:00","2019-01-20 15:00","2019-01-21 03:00"),
  creatinine=c("0.81","0.90","1.00","1.10","1.20","1.30","1.40","0.81","0.90","1.00","1.10","1.20")
)

所以 48 小时间隔 #1 将是测量 1 到 5。肌酐 >= 0.3 的第一次增加将是从测量 1 到测量 5。但是间隔 #1 也可能没有增加,所以我必须重新检查间隔 #2(测量 2 到 6)用于增加,依此类推。

我正在考虑确定每个间隔的最小值和最大值并获得两者的差异,这样我就可以确定在这个间隔中是否有 >= 0.3 的增加。但是,我不知道如何将 48 小时的间隔从记录的开始转移到结束。

我希望,我的问题很清楚,我非常感谢任何帮助或建议。

标签: r

解决方案


使用zoo::rollapply我们可以找到每 5 个 obs 的范围,然后将上式减去下式以检查它是否 >=.3

library(zoo)
library(dplyr) 
library(tidyr) #nest and unnest functions
library(lubridate) #ymd and hours function
library(purrr) #map function

dat$t<-ymd_hm(dat$t)
dat$two_days<-dat$t+hours(48)

fun_wdate<-function(df){
  #browser()
 apply(df,1, function(y){
       if(y['measurement']==1){
    sum((ymd_hms(y['two_days'])<df$t)=='FALSE')
  } else{
    sum((ymd_hms(y['two_days'])<df$t[-c(1:y['measurement']-1)])=='FALSE')
  }
 })
} 

dat <- dat %>% group_by(patient_id) %>% 
               mutate(width=tibble(measurement,t,two_days)%>%fun_wdate)
#Another option
#dat %>% group_by(patient_id) %>%nest() %>% mutate(width=map(data,~fun_wdate(.))) %>% unnest()

dat %>% group_by(patient_id) %>%
 mutate(Inc=rollapply(as.numeric(creatinine),width, 
 FUN=function(x) (if_else (which.min(x)<which.max(x), range(x)[2]-range(x)[1], range(x)[1]-range(x)[2])),
 align='left',fill=NA), Flag=if_else(Inc>=0.29999,'Yes','No'))

推荐阅读