【问题标题】:Can we combine 2 filters in R?我们可以在 R 中组合 2 个过滤器吗?
【发布时间】:2020-10-02 09:05:25
【问题描述】:

最近我在想,2个过滤器功能可以组合成1个过滤器吗?

例如

library(tidyverse)
library(nycflights13)
a <- flights %>% filter(month == 1)
b <- flights %>% filter(day == 1)

现在,a 正在过滤 1 月的航班,b 正在过滤 1 日的航班。 我想组合过滤器 a 和 b,这意味着我想找到 1 月 1 日的航班。 除了

flights %>% filter(month == 1 & day == 1)

我们能不能先找到a和b,把2个过滤器合二为一,因为有时候我需要过滤很多信息,我想如果我能先分别过滤会更容易。谢谢!

【问题讨论】:

  • 你需要flights %&gt;% filter(month == 1 | day == 1)unique(rbind(a, b)) 一样
  • 我尝试运行 unique(rbind(a, b)),但是结果变成了 1 月的所有航班,我想找出 1 月 1 日的航班。有什么办法可以在不使用航班 %>% 过滤器的情况下执行此操作(月 == 1 | 日 == 1)?非常感谢
  • 这不是 1 月 1 日的航班吗? flights %&gt;% filter(month == 1 &amp; day == 1)你想做什么?
  • 哦,等等,您想使用ab 查找1 月1 日的航班,在这种情况下您可以使用intersect(a, b)
  • 是的,完全正确。但是,如果我们有两个以上的元素,我们可以使用 intersect 吗?谢谢

标签: r


【解决方案1】:

这是您正在寻找的点符号定义函数的地方吗:

library(dplyr)

a <- . %>% filter(cyl == 4)  # or a <- function(x) filter(x, cyl == 4)
b <- . %>% filter(gear == 4)

mtcars %>% a %>% b

给出 cyl 为 4 且 gear 为 4 的那些行:

                mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

还请注意,像我们在这里所做的那样连续过滤比单独过滤每个条件然后组合它们更有效。在第一种情况下,我们在每一步都减少数据的大小,但在第二种情况下,我们在每个过滤步骤处理完整数据。

【讨论】:

    【解决方案2】:

    您可以使用dplyr::intersect

    a1 <- flights %>% filter(month == 1)
    a2 <- flights %>% filter(day == 1)
    result1 <- dplyr::intersect(a1, a2)
    nrow(result1)
    #[1] 842
    

    这和做的一样:

    nrow(flights %>% filter(month == 1 & day == 1))
    #[1] 842
    

    如果您有超过 2 个条件,请使用 Reduce

    a3 <- flights %>% filter(dep_delay == 2)
    result2 <- Reduce(dplyr::intersect, list(a1, a2, a3))
    nrow(result2)
    #[1] 23
    

    相同
    nrow(flights %>% filter(month == 1 & day == 1 & dep_delay == 2))
    #[1] 23
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-04
      • 2020-01-05
      • 1970-01-01
      • 2020-01-07
      • 2014-06-30
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多