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.
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()
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()
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()
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()
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
Функции за почистване на данни в 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
Пример
По-долу можем да визуализираме концепцията за преоформяне на широко към дълго. Искаме да създадем една колона с име растеж, запълнена от редовете на променливите за четвъртината.
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 можете да трансформирате набор от данни, като използвате следните функции:
- събирам(): Преобразувайте данните от широки в дълги.
- разпространение(): Преобразувайте данните от дълги към широки.
- отделен(): Разделете една променлива на две.
- единица (): Обединете две променливи в една.