Я работаю со следующим набором данных: library (tidyverse) library (lubridate)
df <- data.frame(
icustay_id = c(1, 1, 1, 2, 3),
starttime = as.POSIXct(c("2019-09-10 13:20", "2019-09-11 13:30", "2019-09-14 16:40", "2019-09-10 12:40", "2019-09-10 01:20")),
endtime = as.POSIXct(c("2019-09-10 13:20", "2019-09-12 01:20", "2019-09-15 16:40", "2019-09-13 13:20", "2019-09-11 13:20")),
vaso_rate = sample(1:10, 5, replace = TRUE),
vaso_amount = runif(5, 0, 1000)
)
df
# icustay_id starttime endtime vaso_rate vaso_amount
# 1 1 2019-09-10 13:20:00 2019-09-11 13:20:00 3 293.0896
# 2 1 2019-09-11 13:30:00 2019-09-12 01:20:00 9 602.9983
# 3 1 2019-09-14 16:40:00 2019-09-15 16:40:00 4 208.9360
# 4 2 2019-09-10 12:40:00 2019-09-13 13:20:00 2 864.1494
# 5 3 2019-09-10 01:20:00 2019-09-11 13:20:00 9 405.2939
В основном, это показывает время начала и окончания приема лекарства, полученного разными пациентами в POSIXCT.
Я пытаюсь создать функцию, которая будет:
- Для каждого отдельного уникального пациента (каждого уникального icustay_id) объединить строки, в которых лечение было остановлено менее чем на час,
- Когда строка сливается: некоторые столбцы сохранят одно и то же значение (т. Е. Идентификаторы пациента). Некоторые столбцы необходимо изменить:
- Сохранить более раннее время начала
- Оставить последнее время окончания
- Среднее значение вазо-курса
- Сумма вазо-суммы
- Удалить длительности
Я борюсь со второй частью, могуКажется, не найти оптимальный способ решения этой условной "слияния".
Чтобы получить что-то вроде:
df
# icustay_id starttime endtime vaso_rate vaso_amount
# 1 1 2019-09-10 13:20:00 2019-09-12 01:20:00 3 293.0896
# 2 1 2019-09-14 16:40:00 2019-09-15 16:40:00 4 208.9360
# 3 2 2019-09-10 12:40:00 2019-09-13 13:20:00 2 864.1494
# 4 3 2019-09-10 01:20:00 2019-09-11 13:20:00 9 405.2939
Обратите внимание в этом примере, как пациент с icustay 1: только события, в которых последовательная разница между временем окончания и временем начала была <1 час был сгруппирован, в то время как третье и более отдаленное событие (> 1 час отличия от остальных) было разгруппировано.
Это то, что я имею до сих пор. Я попытался добавить дополнительный столбец группы для пациентов, которые встречают условие выше, и затем в конечном счете group_by этим условием
Но это не работает ...
merge_pressor_doses <- function(df){
df %>% arrange(icustay_id,starttime)
a <- 1
for (i in unique(df$icustay_id))
{
for (j in which(df$icustay_id==i) && j < max(which(df$icustay_id==i)))
{
df%>%mutate(group = ifelse(df$starttime[j+1]-df$endtime[j] < 60, a, 0))
}
}
df%>%group_by(group) %>%
summarise(
starttime = min(starttime),
endtime = max(endtime),
vaso_rate = mean(vaso_rate),
sum_vaso_amount = sum(vaso_amount))
return(df)
}