Dplyr Tutorial: Sloučení a spojení dat v R s příklady

Úvod do analýzy dat

Analýzu dat lze rozdělit do tří částí:

  • Těžba: Nejprve musíme shromáždit data z mnoha zdrojů a zkombinovat je.
  • Změnit: Tento krok zahrnuje manipulaci s daty. Jakmile zkonsolidujeme všechny zdroje dat, můžeme začít data čistit.
  • Vizualizujte: Posledním krokem je vizualizace našich dat pro kontrolu nesrovnalostí.
Proces analýzy dat
Proces analýzy dat

Jednou z nejvýznamnějších výzev, kterým čelí datoví vědci, je manipulace s daty. Data nejsou nikdy k dispozici v požadovaném formátu. Datoví vědci musí strávit alespoň polovinu svého času čištěním a manipulací s daty. To je jeden z nejdůležitějších úkolů v práci. Pokud proces manipulace s daty není úplný, přesný a přísný, model nebude fungovat správně.

R Dplyr

R má knihovnu nazvanou dplyr, která pomáhá při transformaci dat. Knihovna dplyr je v zásadě vytvořena kolem čtyř funkcí pro manipulaci s daty a pěti sloves pro čištění dat. Poté můžeme použít knihovnu ggplot k analýze a vizualizaci dat.

Naučíme se, jak používat knihovnu dplyr k manipulaci s a Datový rámec.

Sloučit data s R Dplyr

dplyr poskytuje pěkný a pohodlný způsob, jak kombinovat datové sady. Můžeme mít mnoho zdrojů vstupních dat a v určitém okamžiku je musíme zkombinovat. Spojení s dplyr přidá proměnné napravo od původní datové sady.

Dplyr se připojuje

Následují čtyři důležité typy spojení používaných v dplyr ke sloučení dvou datových sad:

funkce Objektivní Argumenty Více kláves
left_join() Sloučit dvě datové sady. Uchovávejte všechna pozorování z tabulky původu data, origin, destination, by = “ID” původ, cíl, podle = c(“ID”, “ID2”)
right_join() Sloučit dvě datové sady. Uchovávejte všechna pozorování z cílové tabulky data, origin, destination, by = “ID” původ, cíl, podle = c(“ID”, “ID2”)
vnitřní spojení() Sloučit dvě datové sady. Vyloučí všechny neshodné řádky data, origin, destination, by = “ID” původ, cíl, podle = c(“ID”, “ID2”)
full_join() Sloučit dvě datové sady. Uchovává všechna pozorování data, origin, destination, by = “ID” původ, cíl, podle = c(“ID”, “ID2”)

Budeme studovat všechny typy spojení na jednoduchém příkladu.

Nejprve vytvoříme dvě datové sady. Tabulka 1 obsahuje dvě proměnné, ID a y, zatímco Tabulka 2 shromažďuje ID a z. V každé situaci musíme mít a klíčový pár variabilní. V našem případě je ID naše klíč variabilní. Funkce bude hledat identické hodnoty v obou tabulkách a sváže vracející se hodnoty napravo od tabulky 1.

Sloučit data s 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()

Nejběžnějším způsobem sloučení dvou datových sad je použití funkce left_join(). Z obrázku níže vidíme, že pár klíčů dokonale odpovídá řádkům A, B, C a D z obou datových sad. E a F však zůstaly. Jak zacházíme s těmito dvěma pozorováními? Pomocí left_join() zachováme všechny proměnné v původní tabulce a nebudeme brát v úvahu proměnné, které nemají v cílové tabulce spárovaný klíč. V našem příkladu proměnná E v tabulce 1 neexistuje. Proto bude řádek vypuštěn. Proměnná F pochází z tabulky počátku; bude zachován po left_join() a vrátí NA ve sloupci z. Obrázek níže reprodukuje, co se stane s left_join().

Příklad dplyr left_join()

Příklad dplyr left_join()

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

Výstup:

## 
# 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()

Funkce right_join() funguje úplně stejně jako left_join(). Jediný rozdíl je vynechaný řádek. Hodnota E dostupná v cílovém datovém rámci existuje v nové tabulce a má hodnotu NA pro sloupec y.

Příklad dplyr right_join()

Příklad dplyr right_join()

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

Výstup:

##
# 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()

Když jsme si 100% jisti, že se tyto dvě datové sady nebudou shodovat, můžeme zvážit návrat 👔 řádky existující v oba datový soubor. To je možné, když potřebujeme čistou datovou sadu nebo když nechceme přičítat chybějící hodnoty průměrem nebo mediánem.

Na pomoc přichází inner_join(). Tato funkce vyloučí neshodné řádky.

Příklad dplyr inner_join()

Příklad dplyr inner_join()

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

Výstup:

## 
# 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()

Nakonec funkce full_join() zachová všechna pozorování a chybějící hodnoty nahradí NA.

Příklad dplyr full_join()

Příklad dplyr full_join()

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

Výstup:

## # 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

Více párů klíčů

V neposlední řadě můžeme mít v naší datové sadě více klíčů. Zvažte následující soubor dat, kde máme roky nebo seznam produktů zakoupených zákazníkem.

Více párů klíčů v R

Pokud se pokusíme sloučit obě tabulky, R vyvolá chybu. Abychom situaci napravili, můžeme předat dvě proměnné párů klíčů. Tedy ID a rok, které se objevují v obou souborech dat. Ke sloučení tabulky 1 a tabulky 2 můžeme použít následující kód

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'))

Výstup:

## # 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

Funkce čištění dat v R

Níže jsou uvedeny čtyři důležité funkce pro uklizení (čištění) dat:

funkce Objektivní Argumenty
shromáždit() Transformujte data z širokých na dlouhé (data, klíč, hodnota, na.rm = FALSE)
šíření() Transformujte data z dlouhých na široké (data, klíč, hodnota)
samostatný() Rozdělte jednu proměnnou na dvě (data, col, into, sep= “”, remove = TRUE)
jednotka() Spojte dvě proměnné do jedné (data, col, conc ,sep= “”, remove = TRUE)

Používáme knihovnu tidyr. Tato knihovna patří do sbírky knihovny pro manipulaci, čištění a vizualizaci dat. Pokud nainstalujeme R s anakondou, knihovna je již nainstalována. Knihovnu najdeme zde, https://anaconda.org/r/r-tidyr.

Pokud ještě není nainstalován, zadejte následující příkaz pro instalaci tidyr:

install tidyr : install.packages("tidyr")

shromáždit()

Cílem funkce collect() je transformovat data z širokých na dlouhá.

Syntax

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

Příklad

Níže si můžeme představit koncept přetváření široký na dlouhý. Chceme vytvořit jeden sloupec s názvem růst, vyplněný řádky kvartálních proměnných.

Příklad funkce collect() v 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

Výstup:

##   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

Výstup:

##    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

Ve funkci collect() vytváříme dvě nové proměnné čtvrtletí a růst, protože naše původní datová sada má jednu skupinovou proměnnou: tj. země a páry klíč-hodnota.

šíření()

Funkce spread() dělá opak shromažďování.

Syntax

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

Příklad

Můžeme přetvořit čistší datovou sadu zpět na chaotický pomocí spread()

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

Výstup:

##   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

samostatný()

Funkce separát() rozdělí sloupec na dva podle oddělovače. Tato funkce je užitečná v některých situacích, kdy je proměnnou datum. Naše analýza může vyžadovat zaměření na měsíc a rok a chceme sloupec rozdělit na dvě nové proměnné.

Syntax

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.

Příklad

V přehlednější datové sadě můžeme oddělit čtvrtletí od roku použitím funkce separát () .

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

Výstup:

##   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

sjednotit()

Funkce unite() spojí dva sloupce do jednoho.

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

Příklad

Ve výše uvedeném příkladu jsme oddělili čtvrtletí od roku. Co když je chceme sloučit. Používáme následující kód:

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

Výstup:

##   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

Shrnutí

  • Analýza dat lze rozdělit do tří částí: Extrakce, Transformace a Vizualizace.
  • R má knihovnu nazvanou dplyr, která pomáhá při transformaci dat. Knihovna dplyr je v zásadě vytvořena kolem čtyř funkcí pro manipulaci s daty a pěti sloves pro čištění dat.
  • dplyr poskytuje pěkný a pohodlný způsob, jak kombinovat datové sady. Spojení s dplyr přidá proměnné napravo od původní datové sady.
  • Krása dplyru je v tom, že zvládá čtyři typy spojení podobně jako SQL:
    • left_join() – Sloučit dvě datové sady a zachovat všechna pozorování z původní tabulky.
    • right_join() – Sloučit dvě datové sady a zachovat všechna pozorování z cílové tabulky.
    • vnitřní spojení() – Chcete-li sloučit dvě datové sady a vyloučit všechny neshodné řádky.
    • full_join() – Sloučit dvě datové sady a zachovat všechna pozorování.
  • Pomocí knihovny tidyr můžete transformovat datovou sadu pomocí následujících funkcí:
    • shromáždit(): Transformujte data z širokých na dlouhé.
    • šíření(): Transformujte data z dlouhých na široké.
    • samostatný(): Rozdělení jedné proměnné na dvě.
    • jednotka(): Spojte dvě proměnné do jedné.