Dplyr Tutorial: Flet og sammenføj data i R med eksempler
Introduktion til dataanalyse
Dataanalyse kan opdeles i tre dele:
- Ekstraktion: For det første skal vi indsamle data fra mange kilder og kombinere dem.
- Transform: Dette trin involverer datamanipulation. Når vi har konsolideret alle datakilderne, kan vi begynde at rense dataene.
- Visualiser: Det sidste skridt er at visualisere vores data for at kontrollere uregelmæssigheder.
En af de væsentligste udfordringer, som dataforskere står over for, er datamanipulation. Data er aldrig tilgængelige i det ønskede format. Dataforskere skal bruge mindst halvdelen af deres tid på at rense og manipulere dataene. Det er en af de mest kritiske opgaver i jobbet. Hvis datamanipulationsprocessen ikke er komplet, præcis og stringent, vil modellen ikke fungere korrekt.
R Dplyr
R har et bibliotek kaldet dplyr til at hjælpe med datatransformation. dplyr-biblioteket er grundlæggende skabt omkring fire funktioner til at manipulere dataene og fem verber til at rense dataene. Derefter kan vi bruge ggplot-biblioteket til at analysere og visualisere dataene.
Vi vil lære, hvordan man bruger dplyr-biblioteket til at manipulere en Dataramme.
Flet data med R Dplyr
dplyr giver en god og praktisk måde at kombinere datasæt på. Vi kan have mange kilder til inputdata, og på et tidspunkt skal vi kombinere dem. En joinforbindelse med dplyr tilføjer variabler til højre for det originale datasæt.
Dplyr tilslutter sig
Følgende er fire vigtige typer joinforbindelser, der bruges i dplyr til at flette to datasæt:
Funktion | Objektiv | argumenter | Flere nøgler |
---|---|---|---|
left_join() | Flet to datasæt. Gem alle observationer fra oprindelsestabellen | data, oprindelse, destination, ved = "ID" | oprindelse, destination, ved = c(“ID”, “ID2”) |
right_join() | Flet to datasæt. Gem alle observationer fra destinationstabellen | data, oprindelse, destination, ved = "ID" | oprindelse, destination, ved = c(“ID”, “ID2”) |
indre_join() | Flet to datasæt. Ekskluderer alle umatchede rækker | data, oprindelse, destination, ved = "ID" | oprindelse, destination, ved = c(“ID”, “ID2”) |
fuld_deltagelse() | Flet to datasæt. Holder alle observationer | data, oprindelse, destination, ved = "ID" | oprindelse, destination, ved = c(“ID”, “ID2”) |
Vi vil studere alle jointyper via et let eksempel.
Først og fremmest bygger vi to datasæt. Tabel 1 indeholder to variable, ID og y, hvorimod tabel 2 samler ID og z. I hver situation skal vi have en nøgle-par variabel. I vores tilfælde er ID vores nøgle variabel. Funktionen leder efter identiske værdier i begge tabeller og binder de returnerende værdier til højre for tabel 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()
Den mest almindelige måde at flette to datasæt på er at bruge funktionen left_join() . Vi kan se på billedet nedenfor, at nøgleparret passer perfekt til rækkerne A, B, C og D fra begge datasæt. E og F er dog tilovers. Hvordan behandler vi disse to observationer? Med left_join() beholder vi alle variablerne i den oprindelige tabel og tager ikke hensyn til de variable, der ikke har et nøglepar i destinationstabellen. I vores eksempel findes variablen E ikke i tabel 1. Derfor vil rækken blive slettet. Variablen F kommer fra oprindelsestabellen; det vil blive holdt efter left_join() og returnere NA i kolonnen z. Figuren nedenfor gengiver, hvad der vil ske med en left_join().
Eksempel på dplyr left_join()
left_join(df_primary, df_secondary, by ='ID')
Output:
## # 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()
Funktionen right_join() fungerer præcis som left_join(). Den eneste forskel er, at rækken er faldet. Værdien E, tilgængelig i destinationsdatarammen, findes i den nye tabel og tager værdien NA for kolonnen y.
Eksempel på dplyr right_join()
right_join(df_primary, df_secondary, by = 'ID')
Output:
## # 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()
Når vi er 100 % sikre på, at de to datasæt ikke stemmer overens, kan vi overveje at vende tilbage kun rækker eksisterende i både datasæt. Dette er muligt, når vi har brug for et rent datasæt, eller når vi ikke ønsker at imputere manglende værdier med middelværdien eller medianen.
Inner_join() kommer for at hjælpe. Denne funktion udelukker de umatchede rækker.
Eksempel på dplyr inner_join()
inner_join(df_primary, df_secondary, by ='ID')
Output:
## # 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()
Endelig beholder funktionen full_join() alle observationer og erstatter manglende værdier med NA.
Eksempel på dplyr full_join()
full_join(df_primary, df_secondary, by = 'ID')
Output:
## # 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
Flere nøglepar
Sidst, men ikke mindst, kan vi have flere nøgler i vores datasæt. Overvej følgende datasæt, hvor vi har år eller en liste over produkter købt af kunden.
Hvis vi forsøger at flette begge tabeller, giver R en fejl. For at afhjælpe situationen kan vi videregive to nøgleparvariabler. Det vil sige ID og årstal som optræder i begge datasæt. Vi kan bruge følgende kode til at flette tabel1 og tabel 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'))
Output:
## # 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
Datarensningsfunktioner i R
Følgende er de fire vigtige funktioner til at rydde (rense) dataene:
Funktion | Objektiv | argumenter |
---|---|---|
samle() | Transformer dataene fra brede til lange | (data, nøgle, værdi, na.rm = FALSK) |
spredning() | Transformer dataene fra lange til brede | (data, nøgle, værdi) |
adskille() | Opdel en variabel i to | (data, col, into, sep= “”, remove = TRUE) |
enhed() | Enhed to variable til én | (data, col, conc ,sep= “”, remove = TRUE) |
Vi bruger tidyr biblioteket. Dette bibliotek tilhører samlingen af biblioteket til at manipulere, rense og visualisere dataene. Hvis vi installerer R med anaconda, er biblioteket allerede installeret. Vi kan finde biblioteket her, https://anaconda.org/r/r-tidyr.
Hvis det ikke allerede er installeret, skal du indtaste følgende kommando for at installere tidyr:
install tidyr : install.packages("tidyr")
samle()
Formålet med funktionen gather() er at transformere dataene fra brede til lange.
Syntaks
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
Eksempel
Nedenfor kan vi visualisere konceptet med at omforme bredt til langt. Vi ønsker at oprette en enkelt kolonne ved navn vækst, fyldt med rækkerne af kvartalsvariablerne.
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
Output:
## 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
Output:
## 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
I funktionen gather() opretter vi to nye variable kvartal og vækst, fordi vores originale datasæt har én gruppevariabel: dvs. land og nøgleværdi-parrene.
spredning()
Funktionen spread() gør det modsatte af gather.
Syntaks
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
Eksempel
Vi kan omforme det mere ryddelige datasæt tilbage til rodet med spread()
# Reshape the data messy_1 <- tidier %>% spread(quarter, growth) messy_1
Output:
## 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
adskille()
Funktionen separate() opdeler en kolonne i to i henhold til en separator. Denne funktion er nyttig i nogle situationer, hvor variablen er en dato. Vores analyse kan kræve fokus på måned og år, og vi ønsker at adskille kolonnen i to nye variable.
Syntaks
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.
Eksempel
Vi kan opdele kvartalet fra året i det mere ryddelige datasæt ved at anvende separat()-funktionen.
separate_tidier <-tidier %>% separate(quarter, c("Qrt", "year"), sep ="_") head(separate_tidier)
Output:
## 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
forene()
Funktionen unite() samler to kolonner til én.
Syntaks
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
Eksempel
I ovenstående eksempel adskilte vi kvartal fra år. Hvad nu hvis vi vil slå dem sammen. Vi bruger følgende kode:
unit_tidier <- separate_tidier %>% unite(Quarter, Qrt, year, sep ="_") head(unit_tidier)
Output:
## 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
Resumé
- Dataanalyse kan opdeles i tre dele: Ekstraktion, Transform og Visualiser.
- R har et bibliotek kaldet dplyr til at hjælpe med datatransformation. dplyr-biblioteket er grundlæggende skabt omkring fire funktioner til at manipulere dataene og fem verber til at rense dataene.
- dplyr giver en god og praktisk måde at kombinere datasæt på. En joinforbindelse med dplyr tilføjer variabler til højre for det originale datasæt.
- Skønheden ved dplyr er, at den håndterer fire typer sammenføjninger, der ligner SQL:
- left_join() – At flette to datasæt og beholde alle observationer fra oprindelsestabellen.
- right_join() – At flette to datasæt og beholde alle observationer fra destinationstabellen.
- indre_join() – At flette to datasæt og ekskludere alle umatchede rækker.
- fuld_deltagelse() – At flette to datasæt og beholde alle observationer.
- Ved hjælp af tidyr-biblioteket kan du transformere et datasæt ved hjælp af følgende funktioner:
- samle(): Transformer dataene fra brede til lange.
- spredning(): Transformer dataene fra lange til brede.
- adskille(): Opdel en variabel i to.
- enhed(): Enhed to variable til én.