Скачать книгу

возможностях dplyr, для этого достаточно использовать такой код:

      группы_рейсов_по_месту_назначения <– group_by(flights, dest)

      задержки <– summarise(группы_рейсов_по_месту_назначения,

      опозданий = n(), средняя_длина_маршрута = mean(distance, na.rm = TRUE),

      средняя_задержка = mean(arr_delay, na.rm = TRUE))

      Оставим в выборке рейсы имеющие более сотни регулярных опозданий и, например, не на московских направлениях:

      задержки <– filter(задержки, опозданий > 100, dest != "MSK")

      Визуализируем оставшиеся записи:

      ggplot(data = задержки, mapping =

      aes(x = средняя_длина_маршрута, y = средняя_задержка)) +

      geom_point(aes(size = опозданий), alpha = 1/5) +

      geom_smooth(se = FALSE)

      Похоже, что задержки растут с увеличением расстояния до ~750 миль, а затем сокращаются. Неужели, когда рейсы становятся длиннее, появляется возможность компенсировать опоздание находясь в полёте?

      Предварительно было пройдено три вспомогательных этапа подготовки данных:

      1. Сгруппированы рейсы по направлениям.

      2. В каждой из групп усреднены расстояния, длительность задержки и вычислено количество опоздавших рейсов.

      3. Отфильтрованы шумы и аэропорт, который не подчиняется законам логики.

      Этот код немного перегружен, так как каждому промежуточному блоку данных присвоено имя. Вспомогательные таблицы сохранялись, даже когда их содержимое не востребовано на заключительном этапе, и замедляли анализ. Но есть отличный способ справиться с обозначенной проблемой посредством настройки каналов передачи данных служебным оператором %>%:

      задержки <– flights %>%

      group_by(dest) %>%

      summarise(

      опозданий = n(),

      средняя_длина_маршрута = mean(distance, na.rm = TRUE),

      средняя_задержка = mean(arr_delay, na.rm = TRUE) ) %>%

      filter(опозданий > 100, dest != " MSK ")

      Такой синтаксис фокусирует внимание исследователя на выполняемых преобразованиях, а не на том, что получается на каждом из вспомогательных этапов, и делает код более читаемым. Это звучит как ряд предписаний: сгруппируй, после этого подведи итоги, после этого отфильтруй полученное. Как подсказывает здравый смысл, можно читать %>% в коде как «после этого». По сути же, формируется информационный канал последовательной передачи данных на обработку от одной функции через другую к третьей. Технически, x %>% f(y) превращается в f(x, y), а x %>% f(y) %>% g(z) превращается в композицию функций g(f(x, y), z) и так далее, что позволяет использовать канал для объединения нескольких операций в одну, которую можно читать слева направо, сверху вниз. Будем часто пользоваться каналами, так как это значительно упрощает читаемость кода, разберём их более подробно в соответствующем разделе.

      Работа с каналами это одна из ключевых особенностей tidyverse. Единственным исключением является ggplot2, так как библиотека была написано до появления такой возможности в R. К сожалению, являющаяся наследником ggplot2 библиотека ggvis хотя и поддерживает работу с каналами, но пока еще не в полной мере.

      Внимательный читатель наверняка задавался вопросом о смысле и предназначении аргумента na.rm. Что будет, если его не писать? Получим много пропущенных значений!

Скачать книгу