【问题标题】:r - filter by date with group by conditionr - 按日期过滤,按条件分组
【发布时间】:2021-10-30 06:16:07
【问题描述】:

在 R 中,使用 dplyr 我想为每个组过滤大于一个日期。

下面给了我结果,但我想知道是否有更优雅的方法来获得相同的结果。不使用mutate是否可以过滤?

max_dates <- data.frame(col_1 = c('a', 'b', 'c'), max_date = c('2021-08-23', '2021-07-19', '2021-07-02'))


df <- data.frame(col_1 = c(rep('a', 10), rep('b', 10), rep('c', 10)),
                 date = rep(seq(as.Date('2021-07-01'), by = 'week', length.out = 10), 3))

desired_df <- df %>% 
  left_join(max_dates, by = 'col_1') %>% 
  mutate(greater_than = ifelse(date >= max_date, T, F)) %>% 
  filter(greater_than)

【问题讨论】:

  • 是的,只需将您的date &gt;= max_date 移动到filter

标签: r filter dplyr group-by


【解决方案1】:

您不需要 mutate 参数;将条件移至过滤器参数...

library(dplyr)

df %>% 
  left_join(max_dates, by = 'col_1') %>% 
    filter(date >= max_date)
#>    col_1       date   max_date
#> 1      a 2021-08-26 2021-08-23
#> 2      a 2021-09-02 2021-08-23
#> 3      b 2021-07-22 2021-07-19
#> 4      b 2021-07-29 2021-07-19
#> 5      b 2021-08-05 2021-07-19
#> 6      b 2021-08-12 2021-07-19
#> 7      b 2021-08-19 2021-07-19
#> 8      b 2021-08-26 2021-07-19
#> 9      b 2021-09-02 2021-07-19
#> 10     c 2021-07-08 2021-07-02
#> 11     c 2021-07-15 2021-07-02
#> 12     c 2021-07-22 2021-07-02
#> 13     c 2021-07-29 2021-07-02
#> 14     c 2021-08-05 2021-07-02
#> 15     c 2021-08-12 2021-07-02
#> 16     c 2021-08-19 2021-07-02
#> 17     c 2021-08-26 2021-07-02
#> 18     c 2021-09-02 2021-07-02

reprex package (v2.0.0) 于 2021 年 8 月 31 日创建

【讨论】:

    【解决方案2】:

    我们可以使用非等值连接

    library(data.table)
    setDT(df)[, date1 := date][max_dates,  on = .(col_1, date1 >= max_date)]
    

    -输出

     col_1       date      date1
     1:     a 2021-08-26 2021-08-23
     2:     a 2021-09-02 2021-08-23
     3:     b 2021-07-22 2021-07-19
     4:     b 2021-07-29 2021-07-19
     5:     b 2021-08-05 2021-07-19
     6:     b 2021-08-12 2021-07-19
     7:     b 2021-08-19 2021-07-19
     8:     b 2021-08-26 2021-07-19
     9:     b 2021-09-02 2021-07-19
    10:     c 2021-07-08 2021-07-02
    11:     c 2021-07-15 2021-07-02
    12:     c 2021-07-22 2021-07-02
    13:     c 2021-07-29 2021-07-02
    14:     c 2021-08-05 2021-07-02
    15:     c 2021-08-12 2021-07-02
    16:     c 2021-08-19 2021-07-02
    17:     c 2021-08-26 2021-07-02
    18:     c 2021-09-02 2021-07-02
    

    【讨论】:

      猜你喜欢
      • 2022-08-02
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多