Используя dplyr::if_else()
в дату, я хочу вернуть NA
- но в R нет NA_date_
или NA_double_
(о котором я знаю - или указано здесь )?Как выполнить следующий код:
ep <- df %>%
group_by(id, episode) %>%
summarise(ep_adm = min(adm, na.rm = T),
ep_sepa = if_else(all(is.na(sepa)),
if_else(all(is.na(adm)), NA, max(adm, na.rm = T)),
max(sepa, na.rm = T)))
без ошибки?
Ошибка в summarise_impl (.data, dots): Ошибка оценки: false
должен иметь тип логический, а не в два раза.
Мотивация для этой проблемы заключается в том, что строки для каждого идентификатора пациента будут классифицированы как эпизод оказания помощи (данные поступают из разных источников данных, один из которых не включаетsepa
даты), который обрабатывается group_by()
.Затем я хочу получить даты начала и окончания эпизода ep_adm
и ep_sepa
.Правило состоит в том, что если все даты разделения NA
, то должна использоваться последняя дата приема, в противном случае используйте последнюю дату разделения.
Код в ожидаемом выводе работает, но я смотрюудалить эти последние 2 строки кода (используя dplyr::if_else()
, так как этот должен вернуть объект <date>
).
Ожидаемый вывод:
ep <- df %>%
group_by(id, episode) %>%
summarise(ep_adm = min(adm, na.rm = T),
ep_sepa = ifelse(all(is.na(sepa)),
ifelse(all(is.na(adm)), NA, max(adm, na.rm = T)),
max(sepa, na.rm = T)))
ep$ep_adm <- as.Date(ep$ep_adm, origin = "1970-01-01")
ep$ep_sepa <- as.Date(ep$ep_sepa, origin = "1970-01-01")
# # A tibble: 4 x 4
# # Groups: id [?]
# id episode ep_adm ep_sepa
# <dbl> <int> <date> <date>
# 1 1 1 2002-06-28 2002-07-05
# 2 1 2 2002-08-25 2002-08-25
# 3 1 3 2003-06-26 2003-06-26
# 4 1 4 2007-04-10 2007-04-11
left_join(df, ep, by = c("id", "episode"))
# # A tibble: 8 x 6
# id episode adm sepa ep_adm ep_sepa
# <dbl> <int> <date> <date> <date> <date>
# 1 1 1 2002-06-28 NA 2002-06-28 2002-07-05
# 2 1 1 2002-06-28 NA 2002-06-28 2002-07-05
# 3 1 1 2002-06-28 2002-07-05 2002-06-28 2002-07-05
# 4 1 1 2002-06-28 2002-07-05 2002-06-28 2002-07-05
# 5 1 2 2002-08-25 NA 2002-08-25 2002-08-25
# 6 1 3 2003-06-26 NA 2003-06-26 2003-06-26
# 7 1 4 2007-04-10 NA 2007-04-10 2007-04-11
# 8 1 4 2007-04-10 2007-04-11 2007-04-10 2007-04-11
data
df <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 1), episode = c(1L,
1L, 1L, 1L, 2L, 3L, 4L, 4L), adm = structure(c(11866, 11866,
11866, 11866, 11924, 12229, 13613, 13613), class = "Date"), sepa = structure(c(NA,
NA, 11873, 11873, NA, NA, NA, 13614), class = "Date")), row.names = c(NA,
-8L), class = c("tbl_df", "tbl", "data.frame"))