代码之家  ›  专栏  ›  技术社区  ›  Paul

使dplyr::if_else()返回NA值

  •  -1
  • Paul  · 技术社区  · 7 年前

    dplyr::if_else() 在约会的时候,我想退票 NA -但是没有 NA_date_ NA_double_ 在R(我知道的-或列出的) here )? 如何执行以下代码:

    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)))
    

    没有错误?

    false 必须是逻辑类型,而不是双精度类型。

    sepa 日期),由 group_by() ep_adm ,和 ep_sepa 那么最后一个入院日期将被使用,其他明智的使用最后一个分离日期。

    dplyr::if\u else() ,就像这样 返回a <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 回复  |  直到 7 年前
        1
  •  2
  •   Ronak Shah    7 年前

    编辑

    对于更新后的数据集,似乎我们可以 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
    
    推荐文章