min_rank和filter的意外输出

时间:2019-03-28 18:19:58

标签: r

我正在研究R for Data Science,并试图找到前10名的延迟航班。我正在使用min_rank来创建每个航班的排名,然后尝试过滤出前10名。我敢肯定我错过了一些简单的事情,但是我得到的结果确实很奇怪,很想解释一个原因,以便将来避免这种情况。

要过滤掉,我使用了x%in%var和== x,但是两者给出的结果不同

library(nycflights13)
library(tidyverse)

flights <- nycflights13::flights
x <- 1:10

select(flights, arr_delay, carrier) %>% 
  mutate(delay_rank = min_rank(desc(arr_delay))) %>% 
  filter(delay_rank == x %in% delay_rank)


select(flights, arr_delay, carrier) %>% 
         mutate(delay_rank = min_rank(desc(arr_delay))) %>% 
         filter(delay_rank == x)

第一个块仅给出第一个结果,而其他第9个都不给出

第二个块给出9,8,4,但其他前10个都不给出。

我希望对前10个结果有所了解。

1 个答案:

答案 0 :(得分:1)

对于多元素比较,我们使用%in%而不是==。在第一次尝试中,不需要delay_rank ==,只需使用delay_rank %in% x即可提取出其中'delay_rank'与'x'元素之一匹配的行

select(flights, arr_delay, carrier) %>% 
    mutate(delay_rank = min_rank(desc(arr_delay))) %>% 
    filter(delay_rank %in% x) 

要了解其工作原理,请检查

(1:5) == (2:3)

在这里,有2、3的循环,直到满足lhs向量的长度。如果第二个向量循环的长度未完成,也会发出警告

(1:5) == c(2, 3, 2, 3, 2)

在第二种情况下,使用%in%

(1:5) %in% (2:3)

检查数字2、3是否与向量中的任何地方匹配