Неожиданный вывод из min_rank и фильтра

#r

#r

Вопрос:

Я работаю через R для Data Science и пытаюсь найти 10 самых задержанных рейсов. Я использую min_rank для создания рейтинга каждого рейса, а затем пытаюсь отфильтровать 10 лучших. Я уверен, что мне не хватает чего-то простого, но я получаю действительно странные результаты и хотел бы получить объяснение, почему, чтобы я мог избежать этого в будущем.

Для фильтрации я использовал x%в% 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 лучших.

Я надеюсь на результат tibble с 10 лучшими результатами.

Комментарии:

1. Я думаю, вам не нужно delay_rank == пытаться с filter(delay_rank %in% x)

2. Почему это работает? Но это так! Спасибо!

Ответ №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 в любом месте вектора

Комментарии:

1. Мне еще многому предстоит научиться, но спасибо за объяснение и ответ. Я исправлю ошибку, как только истеку срок!