【问题标题】:How to properly ignore NA when comparing two dates?比较两个日期时如何正确忽略 NA?
【发布时间】:2020-01-22 20:28:59
【问题描述】:

我有两个日期变量

ID Date1       Date2      
1  2019-09-10  2019-09-09 
1  2019-12-11  2019-12-01
1  NA          2019-12-08
2  2019-09-11  2019-09-25
2  2019-11-05  2019-11-15
2  2019-12-05  NA
3  2019-09-19  2019-09-11
3  2019-10-22  2019-10-17

我想通过运行以下代码来比较日期 1 是否在日期 2 之后

df %>% 
group_by(id) %>% 
mutate(Result = ifelse(!is.na(Date1) < !is.na(Date2), "Yes", 
"No")) 

我想要的是:

ID Date1       Date2       Result
1  2019-09-10  2019-09-09  No
1  2019-12-11  2019-12-01  No
1  NA          2019-12-08  NA
2  2019-09-11  2019-09-25  Yes
2  2019-11-05  2019-11-15  Yes
2  2019-12-05  NA          NA
3  2019-09-19  2019-09-11  No
3  2019-10-22  2019-10-17  No

如果我运行这个,我会为那些包含 NA.. 我不想删除 NA,因为我以后仍然需要这些缺失的信息。我不确定为什么 !is.na() 在这种情况下不起作用。任何帮助将不胜感激!

  • 我也试过 difftime() 也发生了同样的事情

【问题讨论】:

    标签: r date if-statement dplyr


    【解决方案1】:

    我认为您可以在您的ifelse() 语句中删除is.na(),这样可以保留缺失的信息

    df %>% 
    group_by(id) %>% 
    mutate(Result = ifelse(Date1 < Date2, "Yes", "No")) 
    

    【讨论】:

    • 啊,我明白了!我可以问为什么我使用过滤器(!Date1> Date2)时不是这种情况吗?而不是变异是/否变量,我想过滤“否”。但它会丢弃带有 NA 的行
    • @JNB ! Date1 &gt; Date2 可以是TRUEFALSENA,但你不能过滤NA
    【解决方案2】:

    您正在比较两个逻辑向量,!is.na(Date1)!is.na(Date2)。由于TRUEFALSE 可以强制转换为数字向量,因此不等式比较每个值,其中包含NA 的单元格将评估为TRUE,因此比不包含NA 的单元格“更大”。您只需要在此处删除对is.na 的调用,比较将在Date1Date2 的值为NA 的行中保持NAResult

    请注意,您无需在此处使用group_by,因为您正在单独对每一行进行操作。

    df %>%
      mutate(Result = ifelse(Date1 < Date2, "Yes", "No"))
    #> # A tibble: 8 x 4
    #>      ID Date1      Date2      Result
    #>   <dbl> <date>     <date>     <chr> 
    #> 1     1 2019-09-10 2019-09-09 No    
    #> 2     1 2019-12-11 2019-12-01 No    
    #> 3     1 NA         2019-12-08 <NA>  
    #> 4     2 2019-09-11 2019-09-25 Yes   
    #> 5     2 2019-11-05 2019-11-15 Yes   
    #> 6     2 2019-12-05 NA         <NA>  
    #> 7     3 2019-09-19 2019-09-11 No    
    #> 8     3 2019-10-22 2019-10-17 No
    

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 2012-05-08
      • 2018-07-28
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多