Dplyr Урок: Обединяване и свързване на данни в R с примери

Въведение в анализа на данни

Анализът на данните може да бъде разделен на три части:

  • Екстракция: Първо, трябва да съберем данните от много източници и да ги комбинираме.
  • Transform: Тази стъпка включва манипулиране на данни. След като консолидираме всички източници на данни, можем да започнем да почистваме данните.
  • Визуализирайте: Последният ход е да визуализираме нашите данни, за да проверим нередностите.
Процес на анализ на данни
Процес на анализ на данни

Едно от най-значимите предизвикателства, пред които са изправени учените по данни, е манипулирането на данни. Данните никога не са налични в желания формат. Учените по данни трябва да отделят поне половината от времето си за почистване и манипулиране на данните. Това е една от най-критичните задачи в работата. Ако процесът на манипулиране на данни не е пълен, прецизен и строг, моделът няма да работи правилно.

R Dplyr

R има библиотека, наречена dplyr, която помага при трансформирането на данни. Библиотеката dplyr е основно създадена около четири функции за манипулиране на данните и пет глагола за почистване на данните. След това можем да използваме библиотеката ggplot, за да анализираме и визуализираме данните.

Ще научим как да използваме библиотеката dplyr, за да манипулираме a DataFrame.

Обединяване на данни с R Dplyr

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

Dplyr се присъединява

Следват четири важни типа съединения, използвани в dplyr за сливане на два набора от данни:

функция Цел Аргументи Множество ключове
left_join() Обединете два набора от данни. Запазете всички наблюдения от таблицата на произхода данни, произход, дестинация, по = „ID“ произход, дестинация, от = c(“ID”, “ID2”)
right_join() Обединете два набора от данни. Запазете всички наблюдения от целевата таблица данни, произход, дестинация, по = „ID“ произход, дестинация, от = c(“ID”, “ID2”)
inner_join() Обединете два набора от данни. Изключва всички несъвпадащи редове данни, произход, дестинация, по = „ID“ произход, дестинация, от = c(“ID”, “ID2”)
full_join() Обединете два набора от данни. Запазва всички наблюдения данни, произход, дестинация, по = „ID“ произход, дестинация, от = c(“ID”, “ID2”)

Ще проучим всички типове съединения чрез лесен пример.

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

Обединяване на данни с R Dplyr

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

Dplyr left_join()

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

Пример за dplyr left_join()

Пример за dplyr 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

Dplyr right_join()

Функцията right_join() работи точно като left_join(). Единствената разлика е, че редът е изпуснат. Стойността E, налична в целевата рамка с данни, съществува в новата таблица и приема стойността NA за колона y.

Пример за dplyr right_join()

Пример за dplyr right_join()

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

Dplyr inner_join()

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

Inner_join() идва на помощ. Тази функция изключва несъвпадащите редове.

Пример за dplyr inner_join()

Пример за dplyr 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

Dplyr full_join()

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

Пример за dplyr full_join()

Пример за dplyr full_join()

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

Ако се опитаме да обединим и двете таблици, 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

Функции за почистване на данни в R

Следват четирите важни функции за подреждане (почистване) на данните:

функция Цел Аргументи
събирам() Преобразувайте данните от широки към дълги (данни, ключ, стойност, na.rm = FALSE)
разпространение() Преобразувайте данните от дълги към широки (данни, ключ, стойност)
отделен() Разделете една променлива на две (data, col, into, sep= “”, remove = TRUE)
единица () Обединете две променливи в една (data, col, conc, sep= “”, remove = TRUE)

Използваме библиотеката tidyr. Тази библиотека принадлежи към колекцията на библиотеката за манипулиране, почистване и визуализиране на данните. Ако инсталираме R с anaconda, библиотеката вече е инсталирана. Можем да намерим библиотеката тук, https://anaconda.org/r/r-tidyr.

Ако вече не е инсталиран, въведете следната команда, за да инсталирате tidyr:

install tidyr : install.packages("tidyr")

събирам()

Целите на функцията gather() са да преобразува данните от широки в дълги.

Синтаксис

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

Пример

По-долу можем да визуализираме концепцията за преоформяне на широко към дълго. Искаме да създадем една колона с име растеж, запълнена от редовете на променливите за четвъртината.

Пример за функция gather() в R

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

Във функцията gather() създаваме две нови променливи четвърт и растеж, тъй като оригиналният ни набор от данни има една групова променлива: т.е. държава и двойки ключ-стойност.

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

Функцията spread() прави обратното на събирането.

Синтаксис

spread(data, key, value)
arguments: 
data: The data frame used to reshape the dataset
key: Column to reshape long to wide
value: Rows used to fill the new column

Пример

Можем да променим формата на по-подредения набор от данни обратно към разхвърлян с spread()

# 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() разделя колона на две според разделител. Тази функция е полезна в някои ситуации, когато променливата е дата. Нашият анализ може да изисква фокусиране върху месец и година и искаме да разделим колоната на две нови променливи.

Синтаксис

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.

Пример

Можем да разделим тримесечието от годината в по-подредения набор от данни, като приложим функцията отделно().

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

Изход:

##   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() свързва две колони в една.

Синтаксис

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

Пример

В горния пример разделихме тримесечие от година. Ами ако искаме да ги обединим. Използваме следния код:

unit_tidier <- separate_tidier %>%
  unite(Quarter, Qrt, year, sep ="_")
head(unit_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

Oбобщение

  • Анализ на данните може да се раздели на три части: извличане, трансформиране и визуализиране.
  • R има библиотека, наречена dplyr, която помага при трансформирането на данни. Библиотеката dplyr е основно създадена около четири функции за манипулиране на данните и пет глагола за почистване на данните.
  • dplyr предоставя приятен и удобен начин за комбиниране на набори от данни. Обединяването с dplyr добавя променливи отдясно на оригиналния набор от данни.
  • Красотата на dplyr е, че той обработва четири вида съединения, подобни на SQL:
    • left_join() – За обединяване на два набора от данни и запазване на всички наблюдения от таблицата на произхода.
    • right_join() – За обединяване на два набора от данни и запазване на всички наблюдения от целевата таблица.
    • inner_join() – За обединяване на два набора от данни и изключване на всички несъвпадащи редове.
    • full_join() – За обединяване на два набора от данни и запазване на всички наблюдения.
  • С помощта на библиотеката tidyr можете да трансформирате набор от данни, като използвате следните функции:
    • събирам(): Преобразувайте данните от широки в дълги.
    • разпространение(): Преобразувайте данните от дълги към широки.
    • отделен(): Разделете една променлива на две.
    • единица (): Обединете две променливи в една.