Учебное пособие по Dplyr: объединение и объединение данных в R с примерами
Введение в анализ данных
Анализ данных можно разделить на три части:
- Добыча: Во-первых, нам нужно собрать данные из многих источников и объединить их.
- Transform: Этот шаг включает в себя манипулирование данными. Как только мы объединим все источники данных, мы сможем приступить к очистке данных.
- Визуализируйте: Последний шаг — визуализировать наши данные, чтобы проверить их неравномерность.
Одной из наиболее серьезных проблем, с которыми сталкиваются ученые, занимающиеся данными, является манипулирование данными. Данные никогда не доступны в желаемом формате. Ученые, работающие с данными, должны тратить как минимум половину своего времени на очистку данных и манипулирование ими. Это одно из самых ответственных заданий в работе. Если процесс манипулирования данными не является полным, точным и строгим, модель не будет работать правильно.
Р Дплыр
В R есть библиотека dplyr, которая помогает в преобразовании данных. Библиотека dplyr по своей сути создана на базе четырех функций для манипулирования данными и пяти команд для очистки данных. После этого мы можем использовать библиотеку ggplot для анализа и визуализации данных.
Мы научимся использовать библиотеку dplyr для управления Фрейм данных.
Объединить данные с помощью R Dplyr
dplyr предоставляет приятный и удобный способ объединения наборов данных. У нас может быть много источников входных данных, и в какой-то момент нам потребуется их объединить. Соединение с dplyr добавляет переменные справа от исходного набора данных.
Дплир присоединяется
Ниже приведены четыре важных типа соединений, используемых в dplyr для объединения двух наборов данных:
Функция | Цель | аргументы | Несколько ключей |
---|---|---|---|
left_join() | Объедините два набора данных. Сохраняйте все наблюдения из исходной таблицы. | данные, происхождение, назначение, по = «ID» | происхождение, назначение, по = c («ID», «ID2») |
right_join() | Объедините два набора данных. Сохраняйте все наблюдения из целевой таблицы. | данные, происхождение, назначение, по = «ID» | происхождение, назначение, по = c («ID», «ID2») |
внутреннее соединение() | Объедините два набора данных. Исключает все несовпадающие строки | данные, происхождение, назначение, по = «ID» | происхождение, назначение, по = c («ID», «ID2») |
полное_соединение() | Объедините два набора данных. Сохраняет все наблюдения | данные, происхождение, назначение, по = «ID» | происхождение, назначение, по = c («ID», «ID2») |
Мы изучим все типы объединений на простом примере.
Прежде всего, мы создаем два набора данных. Таблица 1 содержит две переменные: ID и y, тогда как таблица 2 содержит идентификаторы и z. В каждой ситуации нам необходимо иметь пара ключей переменная. В нашем случае 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)
Дплир 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
Дплир 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
Дплир Internal_join()
Когда мы на 100% уверены, что два набора данных не совпадают, мы можем рассмотреть возможность возврата Важно строки, существующие в и набор данных. Это возможно, когда нам нужен чистый набор данных или когда мы не хотим приписывать пропущенные значения среднему или медиане.
Internal_join() приходит на помощь. Эта функция исключает несовпадающие строки.
Пример dplyr Internal_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.
Пример 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 выдаст ошибку. Чтобы исправить ситуацию, мы можем передать две переменные пары ключей. То есть идентификатор и год, которые появляются в обоих наборах данных. Мы можем использовать следующий код для объединения таблицы 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 = ЛОЖЬ) |
распространение() | Преобразование данных из длинных в широкие | (данные, ключ, значение) |
отдельный() | Разделить одну переменную на две | (данные, столбец, в, сен = «», удалить = ИСТИНА) |
единица() | Объединение двух переменных в одну | (data, col, conc, sep= «», удалить = TRUE) |
Мы используем библиотеку tidyr. Эта библиотека принадлежит к коллекции библиотек для манипулирования, очистки и визуализации данных. Если мы установим R с anaconda, библиотека уже установлена. Библиотеку мы можем найти здесь, https://anaconda.org/r/r-tidyr.
Если он еще не установлен, введите следующую команду для установки tidyr:
install tidyr : install.packages("tidyr")
собирать()
Целью функции сбора() является преобразование данных из широких в длинные.
Синтаксис
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
В функции сбора() мы создаем две новые переменные: квартал и рост, поскольку наш исходный набор данных имеет одну групповую переменную: т. е. страну и пары ключ-значение.
распространение()
Функция распространения() делает противоположность функции сбора.
Синтаксис
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.
Пример
Мы можем отделить квартал от года в более аккуратном наборе данных, применив функциюdependent().
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() – Объединить два набора данных и сохранить все наблюдения из целевой таблицы.
- внутреннее соединение() – Чтобы объединить два набора данных и исключить все несовпадающие строки.
- полное_соединение() – Объединить два набора данных и сохранить все наблюдения.
- Используя библиотеку tidyr, вы можете преобразовать набор данных, используя следующие функции:
- собирать(): Преобразование данных из широких в длинные.
- распространение(): Преобразование данных из длинного в широкое.
- отдельный(): Разделить одну переменную на две.
- единица(): объединить две переменные в одну.