Неожиданный вывод из min_rank и фильтра - PullRequest
1 голос
/ 28 марта 2019

Я работаю через 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.

Я надеюсь, что у нас получится 10 лучших результатов.

1 Ответ

1 голос
/ 28 марта 2019

Для сравнения нескольких элементов мы используем %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, чтобы соответствовать где угодно в векторе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...