Учебники

9) R Dplyr Tutorial

Введение в анализ данных

Анализ данных можно разделить на три части

  • Извлечение: во-первых, нам нужно собрать данные из многих источников и объединить их.
  • Преобразование: этот шаг включает в себя манипулирование данными. После того, как мы объединили все источники данных, мы можем начать очистку данных.
  • Визуализация: последний шаг — визуализация наших данных для проверки неправильности.

Одной из наиболее значительных проблем, с которыми сталкивается ученый, является манипулирование данными. Данные никогда не доступны в нужном формате. Специалист по данным должен тратить как минимум половину своего времени на очистку и манипулирование данными. Это одно из самых важных заданий в работе. Если процесс манипулирования данными не является полным, точным и строгим, модель не будет работать правильно.

R имеет библиотеку dplyr, которая помогает в преобразовании данных.

Библиотека dplyr в основном создана из четырех функций для манипулирования данными и пяти глаголов для очистки данных. После этого мы можем использовать библиотеку ggplot для анализа и визуализации данных.

В этом уроке мы узнаем, как использовать библиотеку dplyr для манипулирования фреймом данных.

В этом уроке вы узнаете

Объединить с dplyr ()

dplyr предоставляет удобный и удобный способ объединения наборов данных. У нас может быть много источников входных данных, и в какой-то момент нам нужно их объединить. Объединение с dplyr добавляет переменные справа от исходного набора данных. Прелесть dplyr в том, что он обрабатывает четыре типа соединений, похожих на SQL

  • Left_join ()
  • right_join ()
  • внутреннее соединение()
  • full_join ()

Мы рассмотрим все типы соединений на простом примере.

Прежде всего, мы строим два набора данных. Таблица 1 содержит две переменные, ID и y, тогда как Таблица 2 собирает ID и z. В каждой ситуации нам нужна переменная пары ключей . В нашем случае ID является нашей ключевой переменной. Функция будет искать одинаковые значения в обеих таблицах и связывать возвращаемые значения справа от таблицы 1.

library(dplyr)
df_primary <- tribble(
  ~ID, ~y,
   "A", 5,
   "B", 5,
   "C", 8,
   "D", 0,
  "F", 9)
df_secondary <- tribble(
  ~ID, ~y,
   "A", 30,
   "B", 21,
   "C", 22,
   "D", 25,
   "E", 29)

left_join ()

Наиболее распространенный способ объединения двух наборов данных — это использование функции left_join (). Из рисунка ниже видно, что пара ключей идеально соответствует строкам A, B, C и D из обоих наборов данных. Тем не менее, E и F остались. Как мы относимся к этим двум наблюдениям? С помощью left_join () мы сохраним все переменные в исходной таблице и не будем рассматривать переменные, у которых нет пары ключей в таблице назначения. В нашем примере переменная E не существует в таблице 1. Поэтому строка будет удалена. Переменная F происходит из исходной таблицы; он будет сохранен после left_join () и вернет NA в столбце z. На рисунке ниже показано, что произойдет с left_join ().

left_join(df_primary, df_secondary, by ='ID')

Вывод:

## 
# A tibble: 5 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>		
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     F     9    NA	

right_join ()

Функция right_join () работает точно так же, как left_join (). Разница лишь в том, что ряд отброшен. Значение E, доступное в целевом фрейме данных, существует в новой таблице и принимает значение NA для столбца y.

right_join(df_primary, df_secondary, by = 'ID')

Вывод:

##
# A tibble: 5 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     E    NA    29

внутреннее соединение()

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

Inner_join () приходит на помощь. Эта функция исключает несопоставленные строки.

inner_join(df_primary, df_secondary, by ='ID')

вывод:

## 
# A tibble: 4 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25

full_join ()

Наконец, функция full_join () сохраняет все наблюдения и заменяет отсутствующие значения на NA.

full_join(df_primary, df_secondary, by = 'ID')

Вывод:

## # A tibble: 6 x 3
##      ID   y.x   y.y
##   <chr> <dbl> <dbl>
## 1     A     5    30
## 2     B     5    21
## 3     C     8    22
## 4     D     0    25
## 5     F     9    NA
## 6     E    NA    29

Несколько пар ключей

И последнее, но не менее важное: в нашем наборе данных может быть несколько ключей. Рассмотрим следующий набор данных, где у нас есть годы или список продуктов, купленных клиентом.

Если мы попытаемся объединить обе таблицы, R выдаст ошибку. Чтобы исправить ситуацию, мы можем передать две пары ключей. То есть ID и год, которые появляются в обоих наборах данных. Мы можем использовать следующий код для объединения таблиц 1 и 2

df_primary <- tribble(
  ~ID, ~year, ~items,
  "A", 2015,3,
  "A", 2016,7,
  "A", 2017,6,
  "B", 2015,4,
  "B", 2016,8,
  "B", 2017,7,
  "C", 2015,4,
  "C", 2016,6,
  "C", 2017,6)
df_secondary <- tribble(
  ~ID, ~year, ~prices,
  "A", 2015,9,
  "A", 2016,8,
  "A", 2017,12,
  "B", 2015,13,
  "B", 2016,14,
  "B", 2017,6,
  "C", 2015,15,
  "C", 2016,15,
  "C", 2017,13)
left_join(df_primary, df_secondary, by = c('ID', 'year'))

Вывод:

## # A tibble: 9 x 4
##      ID  year items prices
##   <chr> <dbl> <dbl>  <dbl>
## 1     A  2015     3      9
## 2     A  2016     7      8
## 3     A  2017     6     12
## 4     B  2015     4     13
## 5     B  2016     8     14
## 6     B  2017     7      6
## 7     C  2015     4     15
## 8     C  2016     6     15
## 9     C  2017     6     13

Функции очистки данных

Ниже приведены четыре важные функции для очистки данных:

  • collect (): преобразование данных из широких в длинные
  • spread (): преобразование данных из длинного в широкое
  • отделить (): разделить одну переменную на две
  • unit (): объединить две переменные в одну

Мы используем библиотеку Tidyr. Эта библиотека принадлежит к коллекции библиотеки для манипулирования, очистки и визуализации данных. Если мы устанавливаем R с помощью anaconda, библиотека уже установлена. Мы можем найти библиотеку здесь, https://anaconda.org/r/r-tidyr .

Если еще не установлен, введите следующую команду

установить tidyr: install.packages («tidyr»)

установить тидыр

собирать ()

Задача функции collect () — преобразовать данные из широких в длинные.

gather(data, key, value, na.rm = FALSE)
Arguments:
-data: The data frame used to reshape the dataset 
-key: Name of the new column created
-value: Select the columns used to fill the key column
-na.rm: Remove missing values. FALSE by default

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

library(tidyr)
# Create a messy dataset
messy <- data.frame(
  country = c("A", "B", "C"),
  q1_2017 = c(0.03, 0.05, 0.01),
  q2_2017 = c(0.05, 0.07, 0.02),
  q3_2017 = c(0.04, 0.05, 0.01),
  q4_2017 = c(0.03, 0.02, 0.04))
messy

Вывод:

##   country q1_2017 q2_2017 q3_2017 q4_2017
## 1       A    0.03    0.05    0.04    0.03
## 2       B    0.05    0.07    0.05    0.02
## 3       C    0.01    0.02    0.01    0.04
# Reshape the data
tidier <-messy %>%
gather(quarter, growth, q1_2017:q4_2017)
tidier

Вывод:

##    country quarter growth
## 1        A q1_2017   0.03
## 2        B q1_2017   0.05
## 3        C q1_2017   0.01
## 4        A q2_2017   0.05
## 5        B q2_2017   0.07
## 6        C q2_2017   0.02
## 7        A q3_2017   0.04
## 8        B q3_2017   0.05
## 9        C q3_2017   0.01
## 10       A q4_2017   0.03
## 11       B q4_2017   0.02
## 12       C q4_2017   0.04

В функции collect () мы создаем две новые переменные квартал и рост, потому что в нашем исходном наборе данных есть одна групповая переменная: т.е. страна и пары ключ-значение.

распространение()

Функция распространения () делает противоположность сбора.

spread(data, key, value)
arguments: 
  • данные: фрейм данных, используемый для изменения набора данных
  • ключ: столбец, чтобы изменить форму от длинного до широкого
  • значение: строки, используемые для заполнения нового столбца

Мы можем изменить набор данных Tidier обратно в беспорядок с распространением ()

# Reshape the data
messy_1 <- tidier %>%
  spread(quarter, growth) 
messy_1

Вывод:

##   country q1_2017 q2_2017 q3_2017 q4_2017
## 1       A    0.03    0.05    0.04    0.03
## 2       B    0.05    0.07    0.05    0.02
## 3       C    0.01    0.02    0.01    0.04

отдельно ()

Функция Отделение () разбивает столбец на два в соответствии с разделителем. Эта функция полезна в некоторых ситуациях, когда переменная является датой. Наш анализ может потребовать фокусировки на месяце и году, и мы хотим разделить столбец на две новые переменные.

Синтаксис :

separate(data, col, into, sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset 
-col: The column to split
-into: The name of the new variables
-sep: Indicates the symbol used that separates the variable, i.e.:  "-", "_", "&"
-remove: Remove the old column. By default sets to TRUE.

Мы можем отделить квартал от года в наборе данных tidier, применив функцию Отдельные ().

separate_tidier <-tidier %>%
separate(quarter, c("Qrt", "year"), sep ="_")
head(separate_tidier)

Output:

##   country Qrt year growth
## 1       A  q1 2017   0.03
## 2       B  q1 2017   0.05
## 3       C  q1 2017   0.01
## 4       A  q2 2017   0.05
## 5       B  q2 2017   0.07
## 6       C  q2 2017   0.02

unite()

The unite() function concanates two columns into one.

Syntax:

unit(data, col, conc ,sep= "", remove = TRUE)
arguments:
-data: The data frame used to reshape the dataset 
-col: Name of the new column
-conc: Name of the columns to concatenate
-sep: Indicates the symbol used that unites the variable, i.e:  "-", "_", "&"
-remove: Remove the old columns. By default, sets to TRUE

In the above example, we separated quarter from year. What if we want to merge them. We use the following code:

unit_tidier <- separate_tidier %>%
  unite(Quarter, Qrt, year, sep ="_")
head(unit_tidier)

output:

##   country Quarter growth
## 1       A q1_2017   0.03
## 2       B q1_2017   0.05
## 3       C q1_2017   0.01
## 4       A q2_2017   0.05
## 5       B q2_2017   0.07
## 6       C q2_2017   0.02

Summary

Following are four important functions used in dplyr to merge two datasets.

Function Objectives Arguments Multiple keys
left_join() Merge two datasets. Keep all observations from the origin table data, origin, destination, by = «ID» origin, destination, by = c(«ID», «ID2»)
right_join() Merge two datasets. Keep all observations from the destination table data, origin, destination, by = «ID» origin, destination, by = c(«ID», «ID2»)
inner_join() Объединить два набора данных. Исключает все несопоставленные строки данные, источник, пункт назначения, by = «ID» источник, пункт назначения, by = c («ID», «ID2»)
full_join () Объединить два набора данных. Сохраняет все наблюдения данные, источник, пункт назначения, by = «ID» источник, пункт назначения, by = c («ID», «ID2»)

Используя библиотеку tidyr, вы можете преобразовать набор данных с помощью функций собирать (), распространить (), разделить () и объединить ().

функция

Цели

аргументы

собирать ()

Преобразование данных из широкого в длинный

(данные, ключ, значение, na.rm = FALSE)

распространение()

Преобразуйте данные из длинных в широкие

(данные, ключ, значение)

отдельно ()

Разделить одну переменную на две

(data, col, into, sep = «», remove = TRUE)

единица измерения()

Объединить две переменные в одну

(data, col, conc, sep = «», remove = TRUE)