r-按一列中的最近日期对行进行子集设置



目标

我目前正在尝试获取charttime中的所有唯一日期,并检查是否有日期charttime.repletion发生在图表时间后24小时内。如果是这样的话,我想标记它以供以后分析。重要的是,我要保留不符合此标准的charttime。问题是,如果在给定的24小时窗口内有多个日期,我只想为每个图表时间(以及随后的每个数值(获取第一个图表时间。

背景

charttime日期与labvalue(valuenum(以及相应的subject_idhadm_id相关联。charttime.repletion列也是如此,您也可以在下表中看到它。问题是,据我所知,因为hadm_idsubject_id各自有很多valuenums、charttimes和charttime.repletions,所以它创建了一个包含近15000000行的巨大表(在加入之前,行数有数十万(。

到目前为止我做了什么

这是我正在使用的功能:

 subject_id hadm_id icustay_id itemid.repletion charttime.repletion  cgid linkorderid itemid charttime           valuenum valueuom label     flag  fluid category 
        <int>   <int>      <int>            <int> <dttm>              <int>       <int>  <int> <dttm>                 <dbl> <chr>    <chr>     <chr> <chr> <chr>    
 1         11  194540     229441            30026 2178-04-17 00:00:00 15805    11400165  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
 2         11  194540     229441            30026 2178-04-17 00:00:00 17701    11825098  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
 3         11  194540     229441            30026 2178-04-17 00:00:00 15805    11400165  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
 4         11  194540     229441            30026 2178-04-17 00:00:00 15805    11400165  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
 5         11  194540     229441            30026 2178-04-17 00:00:00 15805    11400165  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
 6         11  194540     229441            30026 2178-04-17 00:00:00 17701    11825098  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
 7         11  194540     229441            30026 2178-04-17 00:00:00 17701    11400165  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
 8         11  194540     229441            30026 2178-04-17 00:00:00 15805    11400165  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
 9         11  194540     229441            30026 2178-04-17 00:00:00 17701    11400165  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
10         11  194540     229441            30026 2178-04-17 00:00:00 17701    11400165  50971 2178-04-15 00:00:00      3.8 mEq/L    Potassium NA    Blood Chemistry
# … with 15,494,874 more rows

这是我对问题的尝试它:

    dfPotassiumMethod2 %>%
      mutate(pre.replete = if_else(condition = (charttime.repletion > charttime) & 
      (charttime.repletion <= (charttime + 24*3600 )), 
      true = "yes", false = "no")) %>%
      group_by(charttime.repletion) %>%
      slice_max(order_by = charttime) -> pre_repetionK

当我这样做时,我的输出是:

 12001  173927     222148            30026 2100-06-14 00:00:00 17478     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
 2      12001  173927     222148            30026 2100-06-14 00:00:00 17454     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
 3      12001  173927     222148            30026 2100-06-14 00:00:00 19610     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
 4      12001  173927     222148            30026 2100-06-14 00:00:00 17478     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
 5      12001  173927     222148            30026 2100-06-14 00:00:00 17478     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
 6      12001  173927     222148            30026 2100-06-14 00:00:00 17454     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
 7      12001  173927     222148            30026 2100-06-14 00:00:00 17454     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
 8      12001  173927     222148            30026 2100-06-14 00:00:00 17454     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
 9      12001  173927     222148            30026 2100-06-14 00:00:00 17478     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no         
10      12001  173927     222148            30026 2100-06-14 00:00:00 17478     3120908  50971 2100-06-25 00:00:00        4 mEq/L    Potassium NA    Blood Chemistry no  

我知道charttime.repletion列中的时间戳显示为零,但我认为tibble只是由于某种原因未能显示这些时间戳,而且它们实际上都是不同的时间值。我只是感到困惑,因为我应该只有一个valuenum(4mEq/L(,对应于charttime中最接近它的valuenum

这是一个好的方法吗?在任何情况下,我将如何验证我的结果?

我感谢你在这件事上能提供的任何意见。

数据准备过程


这是我迄今为止创建数据的过程。

到目前为止,我从这张表开始:

      subject_id hadm_id icustay_id itemid.repletion charttime.repletion  cgid linkorderid
        <int>   <int>      <int>            <int> <dttm>              <int>       <int>
 1      21842  174955     250436            30026 2140-11-24 17:00:00 21570     8594378
 2      21857  173189     269052            30026 2116-11-05 18:00:00 20963    11951770
 3      19339  126827     261452            30297 2114-01-08 16:00:00 18197     3512345
 4      25438  169622     240384            30297 2107-01-31 16:00:00 18708     2133610
 5       9175  148433     218471            30026 2194-12-20 10:00:00 14973    11207445
 6      18605  173380     264352            30026 2188-12-13 10:00:00 14597      592655
 7       6960  178048     298934            30026 2120-11-24 00:00:00 19050      109745
 8      18605  173380     264352            30026 2188-12-14 00:00:00 19050      592655
 9      21842  174955     250436            30026 2140-11-21 02:00:00 15690     6813841
10      18028  160399     204739            30026 2131-01-22 02:00:00 15928     5325139
# … with more rows

在我离开的地方,通过这个表上的列subject_idhadm_id连接它:

subject_id hadm_id itemid charttime           valuenum valueuom label     flag     fluid category 
        <int>   <int>  <int> <dttm>                 <dbl> <chr>    <chr>     <chr>    <chr> <chr>    
 1          3      NA  50971 2101-10-13 03:00:00      4.3 mEq/L    Potassium NA       Blood Chemistry
 2          3      NA  50971 2101-10-13 15:47:00      4   mEq/L    Potassium NA       Blood Chemistry
 3          3      NA  50971 2101-10-14 03:00:00      3.7 mEq/L    Potassium NA       Blood Chemistry
 4          3      NA  50971 2101-10-15 03:30:00      4   mEq/L    Potassium NA       Blood Chemistry
 5          3      NA  50971 2101-10-15 12:15:00      4.2 mEq/L    Potassium NA       Blood Chemistry
 6          3      NA  50971 2101-10-16 04:00:00      3.5 mEq/L    Potassium NA       Blood Chemistry
 7          3      NA  50971 2101-10-16 15:30:00      4.9 mEq/L    Potassium NA       Blood Chemistry
 8          3      NA  50971 2101-10-18 05:25:00      4.4 mEq/L    Potassium NA       Blood Chemistry
 9          3  145834  50971 2101-10-20 16:40:00      5.4 mEq/L    Potassium abnormal Blood Chemistry
10          3  145834  50971 2101-10-22 04:00:00      4.3 mEq/L    Potassium NA       Blood Chemistry
# … with more rows

使用此功能:

tbl_mimic(inputevents_cv) %>%
  semi_join(kCVSearch, by = "itemid") %>%
  select(subject_id, hadm_id, icustay_id, itemid, charttime,  cgid,  linkorderid) %>%
  rename(itemid.repletion = itemid, charttime.repletion = charttime) %>% 
  left_join(labEventsK, by=c("subject_id", "hadm_id")) %>%
  collect() -> dfPotassiumMethod2   

编辑:其中tbl_mimic是一个从postgres后端检索给定表的函数。

 tbl_mimic <- function(table) {
      table <- as.character(substitute(table))
      tbl(con, dbplyr::in_schema("mimiciii", table))
    }

你的问题中有太多的事情,而且没有玩具数据集供人们跳上去,所以这是具有挑战性的部分。但如果我正确理解你的意图,这里有一个玩具示例和我如何解决它

如果您从未使用lubridate包来操作日期/日期时间对象,您应该。。。在这里,我方便地使用它的ymd_hms()函数来创建日期时间对象。使用datetime对象,您可以轻松地用它进行比较和数学运算。

library(dplyr)
library(lubridate)
#### Fake data
set.seed(4326)
random_hrs <- runif(20, 12, 30)
df <- data.frame(
  id = rep(c(1, 2), each = 10),
  charttime = rep(ymd_hms(c("2020-05-05 12:01:00", "2020-05-04 13:02:01",
                            "2020-03-05 12:01:00", "2020-03-06 13:02:01")), each = 5)
)
df$charttime.repletion <- df$charttime + dhours(random_hrs)
df
#### Flag rows with charttime.repletion - charttime <= 24 hrs
## difftime function ensures difference in time is measured by hours
df1 <- df %>%
  mutate(flag = (difftime(charttime.repletion, charttime, units = "hours") <= 24) & (difftime(charttime.repletion, charttime, units = "hours") >= 0))
#### Take only rows with flag == TRUE
df2 <- df1 %>%
  filter(flag)
df2
#### For each id x charttime combination, take the row with lowest chartime.repletion
df2 %>%
  group_by(id, charttime) %>%
  mutate(anotherflag = charttime.repletion == min(charttime.repletion)) %>%
  filter(anotherflag)

最新更新