Я пытаюсь провести анализ, для которого мне нужно иметь все столбцы моих данных со значениями.
У меня есть список многих пациентов.Пациенты рассматриваются в 3 возможных ситуациях: неотложные состояния, амбулаторные консультации и госпитализация.
Каждый пациент может посещать эти службы один или несколько раз.
Имеются следующие данные:
- Число
- Дата
- диагноз в отделении неотложной помощи
- диагноз в амбулаторных консультациях
- диагноз при госпитализации
Проблема заключается в том, что пациент приходит в отделение неотложной помощи, толькодиагноз экстренной помощи будет заполнен к этой дате, внешние консультации и госпитализация будут иметь «NA».Точно так же, как если бы вы приходили в амбулаторию, у вас будет АН в отделении неотложной помощи и госпитализации на эту дату (когда вы приходите в поликлинику).
pacient <- c(10,10,10,10,10,11,11,12,12,12); pacient
date <- as.Date(c("01/01/2018","02/01/2018", "04/04/2018", "10/05/2018", "05/09/2018", "02/01/2018", "06/08/2018", "01/01/2018", "03/01/2018", "06/08/2018"), format = "%d/%m/%Y"); date
set <- c("URG", "CEX", "CEX", "URG", "HOSP", "CEX", "URG", "CEX", "CEX", "URG")
dx_URG <- c("A", NA, NA, "B", NA, NA, "A", NA, NA, "B")
dx_CEX <- c(NA, "B", "C", NA, NA, "A", NA, "C", "B", NA)
dx_HOSP <- c(NA, NA, NA, NA, "A", NA, NA, NA,NA,NA)
DF <- data.frame(pacient, date, set, dx_URG, dx_CEX, dx_HOSP)); DF
Мои данные:
pacient date set dx_URG dx_CEX dx_HOSP
1 10 01/01/2018 URG A <NA> <NA>
2 10 02/01/2018 CEX <NA> B <NA>
3 10 04/04/2018 CEX <NA> C <NA>
4 10 10/05/2018 URG B <NA> <NA>
5 10 05/09/2018 HOSP <NA> <NA> A
6 11 02/01/2018 CEX <NA> A <NA>
7 11 06/08/2018 URG A <NA> <NA>
8 12 01/01/2018 CEX <NA> C <NA>
9 12 03/01/2018 CEX <NA> B <NA>
10 12 06/08/2018 URG B <NA> <NA>
- Заполните NA столбца, если это возможно, собственными значениями пациента.То есть пациент 10 приходил в больницу 5 раз в 5 разных дат.При первом посещении генерируется NA в CEX и HOSP, посещение 2 в URG и HOSP ... и так далее.Я хочу заполнить пропущенные значения для пациента 10 в столбце dx_URG самым последним экстренным диагнозом для этого пациента, то есть вы:
A, B, B, B,B
Первое значение остается прежним, второе - NA становится B (так как датировано 10/05/2018 визитом в URG, который ставит диагноз B) и так ... Это для диагностики в CEXпациента 10, я заполнил NA с диагнозом C и для диагностики в HOSP с диагнозом A. Это я достиг, частично, с помощью следующего кода:
dx_remp <- lapply(DF, function(x){
setDT(DF)[, dx_URG:= na.aggregate(dx_URG, FUN=function(x){ tail(x[!is.na(x)],1)}), by = pacient]
setDT(DF)[, dx_CEX:= na.aggregate(dx_CEX, FUN=function(x){ tail(x[!is.na(x)],1)}), by = pacient]
setDT(DF)[, dx_HOSP:= na.aggregate(dx_HOSP, FUN=function(x){ tail(x[!is.na(x)],1)}), by = pacient]
return(num_vist)})
Проблема в том, что этот кодне работает, если у пациента нет диагноза «заполнить»: например, я получаю ошибку при заполнении dx_HOSP, поскольку ни у пациента 11, ни у 12 нет никакого значения.
Второе, что мне нужноВ связи с этим, если у пациентов нет значений для заполнения в столбце, в котором мы заменяем NA, искать его в другом из столбцов: приоритет будет CEX -> HOSP -> URG
Таким образом, я должен сначала заполнить NA, заглянув внутрь столбца, если не было значений, выполнить поиск в dx_CEX, затем в dx_HOS, затем в dx_URG.
Требуемый результат:
pacient date set dx_URG dx_CEX dx_HOSP
1 10 01/01/2018 URG A C A
2 10 02/01/2018 CEX B B A
3 10 04/04/2018 CEX B C A
4 10 10/05/2018 URG B C A
5 10 05/09/2018 HOSP B C A
6 11 02/01/2018 CEX A A A
7 11 06/08/2018 URG A A A
8 12 01/01/2018 CEX B C B
9 12 03/01/2018 CEX B B B
10 12 06/08/2018 URG B B B
Например, пациент 10 в dx_cex имеет пустые даты 1, 4 и 5;NA dx_cex должен быть заполнен последним диагнозом cex для этого пациента, то есть C. У пациента 12 в dx_hosp он не имеет значения ни в одном из цитирований, поэтому необходимо искать последний действительный диагноз вcex, то есть B и заполнить все NA dx_hosp с помощью B.
Спасибо