Вот проблема, которую я пытаюсь решить. Я хочу перенести таблицу 1 в таблицу 2.
Таблица 1:
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
Таблица 2:
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_id), groupby icustay_id, ТОЛЬКО если лекарство было остановлено менее чем на час.
- Когда строка сливается: некоторые столбцы сохранят одно и то же значение (т. Е. Идентификаторы пациента). Некоторые столбцы необходимо изменить:
- Сохранить более раннее время начала
- Оставить последнее время окончания
- Среднее значение вазо-ставки
- Сумма вазо-суммы
Для этого я решил добавить еще один идентификатор столбца, который принимает значение 1, когдаусловие выполнено, и когда все строки проверены, groupby (icustay_id и этот новый столбец)
Мой код в том виде, в котором он написан, однако не присваивает соответствующий идентификатор в отношении условия.
Вот пример кода создания df:
set.seed(1)
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-11 13:20", "2019-09-11 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)
)
Вот код функции, который у меня есть прямо сейчас:
merge_pressor_doses <- function(df){
df %>% arrange(icustay_id,starttime)
for (i in unique(df$icustay_id))
{
for (j in which(df$icustay_id==i))
{
start <- df$starttime[as.numeric(j)+1]
end <- df$endtime[as.numeric(j)]
stopduration <- as.numeric(difftime(start, end, units = 'mins'))
bool <- stopduration < 60
df <- df%>%mutate(
group = case_when(
bool = TRUE ~ 1,
bool = FALSE ~ 0)
)
}
}
return(df)
}
Это должно привести к:
df
# icustay_id starttime endtime vaso_rate vaso_amount group
# 1 1 2019-09-10 13:20:00 2019-09-11 13:20:00 3 293.0896 1
# 2 1 2019-09-11 13:30:00 2019-09-12 01:20:00 9 602.9983 1
# 3 1 2019-09-14 16:40:00 2019-09-15 16:40:00 4 208.9360 0
# 4 2 2019-09-10 12:40:00 2019-09-13 13:20:00 2 864.1494 1
# 5 3 2019-09-10 01:20:00 2019-09-11 13:20:00 9 405.2939 1
Но в моем случае 3-й строке присваивается значение 1 ...
Если мне удастся заставить эту часть кода работать, я мог бы перейти к этой части кода для достижения своей цели.
Возможный второй ркод будет такой:
group_by(group, icustay_id) %>%
summarise(
starttime = min(starttime),
endtime = max(endtime),
vaso_rate = mean(vaso_rate),
sum_vaso_amount = sum(vaso_amount))
Заранее спасибо !!