#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. Мне еще многому предстоит научиться, но спасибо за объяснение и ответ. Я исправлю ошибку, как только истеку срок!