目标
我目前正在尝试获取charttime
中的所有唯一日期,并检查是否有日期charttime.repletion
发生在图表时间后24小时内。如果是这样的话,我想标记它以供以后分析。重要的是,我要保留不符合此标准的charttime
。问题是,如果在给定的24小时窗口内有多个日期,我只想为每个图表时间(以及随后的每个数值(获取第一个图表时间。
背景
charttime
日期与labvalue(valuenum
(以及相应的subject_id
和hadm_id
相关联。charttime.repletion
列也是如此,您也可以在下表中看到它。问题是,据我所知,因为hadm_id
和subject_id
各自有很多valuenums、charttime
s和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_id
和hadm_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)