r - 按日期过滤,按条件分组

Posted

技术标签:

【中文标题】r - 按日期过滤,按条件分组【英文标题】:r - filter by date with group by condition 【发布时间】: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 【参考方案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

【讨论】:

以上是关于r - 按日期过滤,按条件分组的主要内容,如果未能解决你的问题,请参考以下文章

按 id 和某些条件过滤掉数据分组

大熊猫在grouby之后按日期时间过滤

具有特定条件计数的 Mongodb 聚合并按输出投影的日期范围过滤不能按预期工作

如何按日期过滤列

WP Elementor:按日期过滤存档帖子(例如通过自定义查询)

仅在满足另一个条件时如何按列过滤查询