Сочетание множества встроенных функций с оператором конвейера для эффективного анализа данных

Оператор канала % ›% используется для передачи вывода функции другой функции, что позволяет объединять функции в цепочку. Конечным результатом является блок очень удобочитаемого кода с отдельными функциями, объединенными в цепочку.

Давайте посмотрим на примере, чтобы понять. Рассмотрим следующие 3 функции

  • Квадрат числа - квадрат
  • Двойное число - двойное
  • Число, обратное - обратное
  • Округление числа до 1 десятичного знака - округление

Допустим, мы хотим применить эти три функции к массиву чисел. Один из способов сделать это - связать эти функции вместе.

#An array of numbers [0.1, 0.2, 0.3, ...., 1]
x = seq(0.1,1,by=0.1)
#Chaining Them Together
round(square(double(inverse(x)), digits=1)

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

#An array of numbers [0.1, 0.2, 0.3, ...., 1]
x <- seq(0.1,1,by=0.1)
#Pipeline of functions
x %>% square %>% double %>% inverse %>% round(digits=1)

Результат одинаков для обоих

Обратите внимание, что трубопровод начинается слева направо. Массив x сначала возводится в квадрат, затем удваивается, затем инвертируется и, наконец, округляется.

использование

Чтобы использовать функцию конвейера, просто подключите библиотеку tidyverse. Tidyverse - это набор наиболее часто используемых пакетов в R. После успешной установки и включения вы можете использовать оператор канала в своем коде.

Установить tidyverse

install.packages("tidyverse")

Чтобы включить его в свой код, просто напишите

library(tidyverse)

После выполнения этот оператор присоединяет к вашей среде различные пакеты. Обратите внимание, что он включает в себя различные пакеты для обработки строк, а также библиотеку построения ggplot2.

Теперь давайте попробуем использовать функцию конвейера в реальной ситуации. В следующем примере мы извлечем данные о COVID-19 из

Анализ набора данных Covid

Цель анализа будет заключаться в том, чтобы увидеть страны, в которых число случаев, зарегистрированных сегодня, было менее 10. С такой же легкостью мы можем также наблюдать страны, в которых число случаев превышало пороговое значение.

Мы будем использовать набор данных COVID-19, собранный Центром системных наук и инженерии Университета Джона Хопкинса (JHU CCSE) из различных источников, включая Всемирную организацию здравоохранения (ВОЗ), BNO News и т. Д. JSU CCSE поддерживает данные на 2019 Репозиторий данных о новом коронавирусе COVID-19 (2019-nCoV) на github.



Получение данных

Мы получаем данные с помощью функции read_csv. Для целей нашего анализа мы проанализируем только подтвержденные случаи.

confirmed_raw <- read_csv(link_to_data)

Выполнение этой команды дает нам фрейм данных из 264 строк и 86 столбцов. Обратите внимание, что переменная link_to_data является очень длинной гиперссылкой и может быть скопирована из содержания, прикрепленного в конце статьи.

Голова данных

head(confirmed_raw)

Заголовок данных суммирует для нас набор данных. Он показывает нам следующую информацию

  1. Первые 6 строк данных
  2. Имена столбцов
  3. Количество столбцов
  4. Типы столбцов

Мы видим, что первые четыре столбца описывают данные о стране, по которой собираются данные. Каждый столбец после этого относится к одному дню с последними данными в конце. Обратите внимание, что после 29 января команда head обрезает набор данных, поскольку он слишком велик для просмотра, и отображает все имена столбцов в закомментированной форме.

Передача данных по конвейеру

Теперь давайте начнем передавать данные.

Мы будем передавать данные по конвейеру с помощью следующих методов

  • Выбор подмножества фрейма данных
  • Переименование столбцов
  • Фильтрация тех строк, которые имеют более 10 случаев
  • Группировка строк по странам и отображение суммы всех случаев по провинциям. (В одной стране может быть несколько строк, каждая из которых относится к разному штату / провинции)

Набор данных выглядит так

Выбор подмножества

Функция выбора работает так

#To Keep Only Columns M through N
select(c(M,N))
#To Remove Columns M through N
select(-c(M,N))
#e.g. Keep columns 2 to 10
select(c(2,10))

В необработанном фрейме данных мы видим, что данные начинаются с 22 января. Нам не нужны все данные. Нам нужны только первые 4 столбца и подтвержденные случаи на сегодня и вчера. Итак, мы выбираем столбцы с 1 по 4 и столбцы с 85 по 86. Мы назначаем эти данные переменной conf_subset.

conf_subset <- confirmed_raw %>%
  select(c(1:4),c(85,86))

Обратите внимание, как мы передали больший фрейм данных в функцию выбора. Conf_subset выглядит так.

Обратите внимание, что теперь у нас осталось только 2 столбца данных. 20 апреля и 20 апреля.

Переименование данных

Однако мы не хотим, чтобы имена наших столбцов были датами. Поэтому мы переименуем их в сегодня и вчера. Кроме того, нам не нужны такие названия, как "Область / штат" или "Страна / регион". Поэтому мы переименуем их в Провинция и Страна соответственно.

conf_subset <- confirmed_raw %>%
  select(c(1:4),c(85,86)) %>%
  rename(Country   = "Country/Region",
         Province  = "Province/State",
         today     = colnames(confirmed_raw)[86],
         yesterday = colnames(confirmed_raw)[85]
  )

Обратите внимание, как мы передали данные в метод rename. Так теперь выглядит фреймворк.

Теперь у нас есть нужные нам имена столбцов. Проблема в том, что у нас все еще есть 264 строки данных. Посмотрим, как это выглядит на сюжете.

Слишком много стран. Самые высокие столбцы соответствуют таким странам, как США и Италия.

Фильтрация по количеству

Теперь давайте удалим все страны и провинции, у которых сегодня счет больше 10.

conf_subset <- confirmed_raw %>%
  select(c(1:4),c(85,86)) %>%
  rename(Country   = "Country/Region",
         Province  = "Province/State",
         today     = colnames(confirmed_raw)[86],
         yesterday = colnames(confirmed_raw)[85]
  ) %>%
  filter( today < 10) #%>%

У нас осталось всего 28 рядов

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

Посмотрите на четвертую полосу, соответствующую Канаде. В 1 провинции Канады указано отрицательное число, поэтому полоса опускается ниже 0. Отрицательное число может означать ложно зарегистрированный подтвержденный случай. Точно так же обратите внимание на третью последнюю полосу, соответствующую Соединенному Королевству.

Группировка по странам

Мы не хотим видеть данные по провинциям отдельно. Мы хотим видеть все это вместе.

conf_subset <- confirmed_raw %>%
  select(c(1:4),c(85,86)) %>%
  rename(Country   = "Country/Region",
         Province  = "Province/State",
         today     = colnames(confirmed_raw)[86],
         yesterday = colnames(confirmed_raw)[85]
  ) %>%
  filter( today < 10) #%>%
  group_by(Country) %>%
    summarise(
      Yesterday = sum(yesterday),
      Today = sum(today)
    )

Обратите внимание, что метод group_by идет вместе с методом summarize, потому что после группировки мы можем выполнять функции для каждой группы. например здесь мы выполняем sum () для каждой группы.

Это дает нам следующий фрейм данных

Обратите внимание, что данные Канады суммируются и уменьшаются на 1 со вчерашнего дня до сегодняшнего дня. На графике данные выглядят так.

Весь конвейер методов выглядит так

confirmed_raw %>% select %>% rename %>% filter %>% group_by %>% summarise

В эту цепочку можно добавить еще много методов. Мы видим, что после 10 или более методов этот конвейер становится громоздким.

Когда избегать труб

Хэдли Уикхэм, изобретатель трубок, заявляет в своем блоге о случаях, когда трубопроводы могут оказаться бесполезными.

Когда не использовать трубу
Трубка - мощный инструмент, но это не единственный инструмент в вашем распоряжении, и он не решает всех проблем! Каналы наиболее полезны для переписывания довольно короткой линейной последовательности операций.

  • Более 10 шагов - в этом случае создайте промежуточные объекты с понятными именами. Это упростит отладку, потому что вам будет легче проверять промежуточные результаты.
  • Несколько входов или выходов - если преобразовывается не один первичный объект, а два или более объекта, объединяемых вместе, не используйте конвейер.
  • Сложная структура зависимостей - конвейеры по своей сути линейны, и выражение сложных отношений с ними обычно приводит к путанице в коде.

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

Рахул создал очень красивую панель управления с открытым исходным кодом, полностью на языке R, которая показывает информативные визуализации того, как прогрессирует болезнь COVID.