Підручник Dplyr: об’єднання та об’єднання даних у R із прикладами
Вступ до аналізу даних
Аналіз даних можна розділити на три частини:
- Видобуток: По-перше, нам потрібно зібрати дані з багатьох джерел і об’єднати їх.
- Перетворення: Цей крок передбачає маніпулювання даними. Після того, як ми об’єднаємо всі джерела даних, ми можемо приступити до очищення даних.
- Візуалізувати: Останнім кроком є візуалізація наших даних, щоб перевірити невідповідність.
Однією з найбільш важливих проблем, з якими стикаються науковці з даних, є маніпулювання даними. Дані ніколи не доступні в потрібному форматі. Науковці даних повинні витрачати принаймні половину свого часу на очищення та маніпулювання даними. Це одне з найважливіших завдань у роботі. Якщо процес обробки даних не є повним, точним і суворим, модель не працюватиме належним чином.
Р Дплір
У R є бібліотека dplyr, яка допомагає трансформувати дані. Бібліотека dplyr створена навколо чотирьох функцій для маніпулювання даними та п’яти дієслів для очищення даних. Після цього ми можемо використовувати бібліотеку ggplot для аналізу та візуалізації даних.
Ми навчимося використовувати бібліотеку dplyr для маніпулювання a Кадр даних.
Об’єднати дані з R Dplyr
dplyr забезпечує гарний і зручний спосіб об’єднання наборів даних. У нас може бути багато джерел вхідних даних, і в якийсь момент нам потрібно їх об’єднати. Об’єднання з dplyr додає змінні праворуч від вихідного набору даних.
Dplyr приєднується
Нижче наведено чотири важливі типи об’єднань, які використовуються в dplyr для об’єднання двох наборів даних:
функція | мета | Аргументи | Кілька ключів |
---|---|---|---|
left_join() | Об’єднайте два набори даних. Зберігайте всі спостереження з таблиці походження | дані, джерело, пункт призначення, за = “ID” | походження, призначення, за = c(“ID”, “ID2”) |
right_join() | Об’єднайте два набори даних. Зберігайте всі спостереження з таблиці призначення | дані, джерело, пункт призначення, за = “ID” | походження, призначення, за = c(“ID”, “ID2”) |
внутрішнє з'єднання() | Об’єднайте два набори даних. Виключає всі невідповідні рядки | дані, джерело, пункт призначення, за = “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 видасть помилку. Щоб виправити ситуацію, ми можемо передати дві змінні пари ключів. Тобто ідентифікатор і рік, які відображаються в обох наборах даних. Ми можемо використати наступний код, щоб об’єднати table1 і table 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() діє протилежно Gather.
синтаксис
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().
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
Підсумки
- Аналіз даних можна розділити на три частини: вилучення, перетворення та візуалізація.
- У R є бібліотека dplyr, яка допомагає трансформувати дані. Бібліотека dplyr створена навколо чотирьох функцій для маніпулювання даними та п’яти дієслів для очищення даних.
- dplyr забезпечує гарний і зручний спосіб об’єднання наборів даних. Об’єднання з dplyr додає змінні праворуч від вихідного набору даних.
- Принадність dplyr полягає в тому, що він обробляє чотири типи об’єднань, подібних до SQL:
- left_join() – Щоб об’єднати два набори даних і зберегти всі спостереження з вихідної таблиці.
- right_join() – Щоб об’єднати два набори даних і зберегти всі спостереження з таблиці призначення.
- внутрішнє з'єднання() – Для об’єднання двох наборів даних і виключення всіх невідповідних рядків.
- full_join() – Щоб об’єднати два набори даних і зберегти всі спостереження.
- Використовуючи бібліотеку tidyr, ви можете трансформувати набір даних за допомогою таких функцій:
- збиратися(): перетворення даних із широких на довгі.
- поширення(): перетворення даних із довгих на широкі.
- окремо (): розділити одну змінну на дві.
- одиниця (): об’єднайте дві змінні в одну.