Увеличьте счетчик, когда значение TRUE в логическом столбце в R - PullRequest
0 голосов
/ 09 мая 2019

Я работаю через R4DS и в настоящее время выполняю 5.6.7 упражнений (https://r4ds.had.co.nz/transform.html#exercises-11).

Номер 1 здесь предлагает рассмотреть некоторые сценарии типичных характеристик задержки полетов. Первая подпункта: «Полет на 15 минут раньше в 50% случаев и на 15 минут позже в 50% случаев».

Я хочу найти полеты в наборе данных "nycflights13", которые имеют равное количество времени опоздания в 15 минут, а также время прибытия в 15 минут.

До этого момента я создавал новый фрейм данных, в котором есть только год, месяц, день, номер хвоста и задержка прибытия. Я также использовал dplyr для изменения и добавления логических столбцов «15_min_delay» и «15_min_early».

Затем я отфильтровал, используя plyr, для создания нового кадра данных, который содержит только полеты, которые были на 15 минут раньше или на 15 минут позже.

Отсюда я хочу сгруппировать по хвостам, я обнаружил, что у меня около 2,7 тысяч уникальных хвостов, но у меня 9266 наблюдений. Поэтому я знаю, что некоторые хвосты будут повторяться.

Как только я создал r odd_delays_new, я немного растерялся, куда идти. Я попытался создать цикл for с ifelse внутри него, чтобы перебрать все 9 266 наблюдений и +1 к счетчику задержки или раннему счетчику, но это дало мне ошибку.

odd_delays <- flights %>%
  select(year, month, day, tailnum, arr_delay) %>%
  mutate("15_minute_delay" = arr_delay == 15, "15_minute_early" = arr_delay == -15)
length(odd_delays$"15_minute_delay"[odd_delays$"15_minute_delay" == TRUE])
length(odd_delays$"15_minute_early"[odd_delays$"15_minute_early" == TRUE])
odd_delays_new <- odd_delays %>%
  filter(odd_delays$`15_minute_delay` == TRUE | odd_delays$`15_minute_early` == TRUE)
  ifelse(odd_delays_new$`15_minute_delay` == TRUE, delay = delay + 1, early = early + 1)

Я ожидаю, что мои результаты будут представлять собой фрейм данных из 3 столбцов. В первом столбце будет указан номер хвоста, во втором столбце будет указано, сколько раз самолет имел задержку прибытия на 15 минут, а в третьем столбце будет указано количество раз, когда самолет прибыл на 15 минут раньше.

1 Ответ

0 голосов
/ 10 мая 2019

Я собираюсь ответить на это в двух частях.

  • как бы я подошел к этому
  • альтернативам для вашего цикла for.

решение проблемы

Чтобы ответить на ваш вопрос, выможет оставаться в пределах dplyr трубопровода.Я считаю, что книга означает не менее 15 минут рано / поздно, поэтому я использовал >= и <=, и вы хотите понять соотношение задержек / ранних поступлений к общему количеству, поэтому вам нужно сначала найти свой знаменатель.n() - количество наблюдений, основанных на группировке.Затем я использую sum() для этих логических результатов.R будет обрабатывать логические значения как 0,1, если вы попросите его sum() или выполните другую математику.

off_schedule <-
  flights %>%
  group_by(tailnum) %>% 
  summarise(
    n = n(),
    delay_15min = sum(arr_delay >= 15, na.rm = TRUE),
    early_15min = sum(arr_delay <= -15, na.rm = TRUE)
  ) %>% 
  ungroup() %>% 
  mutate(
    delay_pct = delay_15min/n*100,
    early_pct = early_15min/n*100,
    off_pct = delay_pct + early_pct
  )

Это дает нам следующую таблицу:

# tailnum       n delay_15min early_15min delay_pct early_pct off_pct
#   <chr>   <int>       <int>       <int>     <dbl>     <dbl>   <dbl>
#  D942DN      4           2           0     50          0      50  
#  N0EGMQ    371          95          73     25.6       19.7    45.3
#  N10156    153          51          34     33.3       22.2    55.6
#  N102UW     48           7          13     14.6       27.1    41.7
#  N103US     46           2          13      4.35      28.3    32.6

цикл for

Для того, чтобы ваш цикл работал, вы должны будете использовать значения индекса.

for (i in 1:nrow(odd_delays)){  
  if(odd_delays_new$`15_minute_delay`[i] == TRUE){
    odd_delays_new$delay[i] <- odd_delays_new$delay[i-1] + 1
  } 

  if(odd_delays_new$`15_minute_early`[i] == TRUE){
    odd_delays_new$early[i] <- odd_delays_new$early[i-1] + 1
  } 
}

Писать или читать 3 года спустя неинтересно.К счастью, функция cumsum() может подсчитать их:

df <-
  odd_delays_new %>% 
  group_by(tailnum) %>% 
  mutate(
    delay = cumsum(`15_minute_delay`),
    early = cumsum(`15_minute_early`)
  ) %>% 
  ungroup()

Это решение, однако, не помогает вам понять, как часто N0EGMQ не в расписании, оно просто сообщает вам о N0EGMQ рейсах, которыене по графику, сколько задержек против раннего прибытия.

Надеюсь, это поможет.

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