【问题标题】:r filter dates with NAsr 使用 NA 过滤日期
【发布时间】:2021-11-29 20:20:19
【问题描述】:

我正在处理这样的数据集

Id   Col1   Date   FromDate   ToDate     Weight
1    Blue   2018   NA         NA         24.9
2    Green  2018   NA         NA         14.5
3    Red    2010   2009-05-15 2015-09-15 87.5
3    Red    2010   2015-10-15 2020-08-15 43.8
4    Yellow 2020   2019-10-15 2021-05-15 29.5
5    Purple 2011   NA         NA         NA
  • 我喜欢在 From 和 To Date 列中保留 NA 的行,因为没有什么可以比较 Date 列中的 Date 值和

  • 如果 From 和 To Date 没有丢失,则仅保留 Date 值介于 From 和 To Date 之间的那些。

根据逻辑,预期的数据集应该是这样的

Id   Col1   Date   FromDate   ToDate     Weight
1    Blue   2018   NA         NA         24.9
2    Green  2018   NA         NA         14.5
3    Red    2010   2009-05-15 2015-09-15 87.5

4    Yellow 2020   2019-10-15 2021-05-15 29.5
5    Purple 2011   NA         NA         NA

我知道我可以使用 filter 函数,但我不确定如何使它与未排除的 NA 值一起工作。任何建议都非常感谢。

【问题讨论】:

    标签: r datetime dplyr filter


    【解决方案1】:

    你应该可以这样做:

    df <- tribble(
      ~Date, ~From, ~To,
      2018, NA, NA,
      2010, "2009-05-09", "2015-09-15"
    )
    
    df %>% filter(
      # Condition 1
      (is.na(From) & is.na(To)) | 
        # Condition 2
        ((Date > year(From))) & 
           (Date < year(To))))
      )
    

    【讨论】:

    • 谢谢。我不知道我们可以像这样在过滤器语句中字符串多个条件。
    【解决方案2】:

    这是另一个解决方案,它利用了{lubridate} 包。

    library(tidyverse)
    library(lubridate)
    #> 
    #> Attaching package: 'lubridate'
    #> The following objects are masked from 'package:base':
    #> 
    #>     date, intersect, setdiff, union
    dates <- tibble::tribble(
               ~Id,    ~Col1, ~Date,    ~FromDate,      ~ToDate, ~Weight,
                1L,   "Blue", 2018L,           NA,           NA,    24.9,
                2L,  "Green", 2018L,           NA,           NA,    14.5,
                3L,    "Red", 2010L, "2009-05-15", "2015-09-15",    87.5,
                3L,    "Red", 2010L, "2015-10-15", "2020-08-15",    43.8,
                4L, "Yellow", 2020L, "2019-10-15", "2021-05-15",    29.5,
                5L, "Purple", 2011L,           NA,           NA,      NA
               )
    
    dates %>% 
      mutate(FromDate = lubridate::ymd(FromDate),
             ToDate   = lubridate::ymd(ToDate),
             Date     = lubridate::ymd(Date, truncated = 2L),
             Interval = lubridate::interval(ymd(FromDate), ymd(ToDate))) %>% 
      filter( ((Date %within% Interval) == TRUE) | (is.na(FromDate) & is.na(ToDate))) %>% 
      select(-Interval)
    #> # A tibble: 5 × 6
    #>      Id Col1   Date       FromDate   ToDate     Weight
    #>   <int> <chr>  <date>     <date>     <date>      <dbl>
    #> 1     1 Blue   2018-01-01 NA         NA           24.9
    #> 2     2 Green  2018-01-01 NA         NA           14.5
    #> 3     3 Red    2010-01-01 2009-05-15 2015-09-15   87.5
    #> 4     4 Yellow 2020-01-01 2019-10-15 2021-05-15   29.5
    #> 5     5 Purple 2011-01-01 NA         NA           NA
    

    reprex package (v2.0.1) 于 2021 年 10 月 11 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-27
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      相关资源
      最近更新 更多