Заставьте dplyr :: if_else () вернуть значение NA - PullRequest
0 голосов
/ 10 октября 2018

Используя 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"))

1 Ответ

0 голосов
/ 10 октября 2018

РЕДАКТИРОВАТЬ

Для обновленного набора данных, кажется, мы можем просто взять max Дата из столбцов sepa и adm вместе взятых.

df %>% 
   group_by(id, episode) %>% 
   summarise(ep_adm = min(adm, na.rm = T), 
             ep_sepa = max(c(sepa, adm), na.rm = TRUE))

#     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

Оригинальный ответ

Если я правильно понял ваш код, вы можете уменьшить его, используя coalesce.Здесь для столбца ep_sepa мы получаем первую запись не-NA из столбцов max(sepa) и max(adm).

library(dplyr)

df %>%
   group_by(rootnum, episode) %>%
   summarise(ep_adm = min(adm, na.rm = T), 
             ep_sepa = coalesce(max(sepa), max(adm)))



#  rootnum episode  ep_adm     ep_sepa   
#    <dbl>   <int> <date>     <date>    
#1       1       1 2002-06-28 2002-06-28
#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-10
#5       2       2 2012-06-26 2012-06-26
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...