使dplyr :: if_else()返回NA值

时间:2018-10-10 08:33:41

标签: r date if-statement dplyr

在日期上使用dplyr::if_else(),我想返回一个NA-但R中没有NA_date_NA_double_(我知道-或列出了{ {3}})?如何执行以下代码:

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,点)中的错误:评估错误:false   必须为逻辑类型,不能为double。

此问题的动机是将每个患者ID的行分类为一次护理(数据来自不同的数据源,其中一个不包含sepa日期),即由group_by()处理。然后,我想获取剧集的开始日期和结束日期ep_admep_sepa。规则是,如果所有的离职日期都是NA,那么将使用最后的入学日期,否则应使用最后的离职日期。

预期输出中的代码有效,但我希望删除最后两行代码(使用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

数据

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 :(得分:2)

编辑

对于更新后的数据集,看来我们可以只将return f"{nom} {dat and '(%s)' % dat}. {tit}. {jou}. {pbm and 'Pubmed: ' + pbm}" 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_sepamax(sepa)列中获得第一个非NA条目。

max(adm)