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.
Dataanalyseproces
Dataanalyseproces

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.

Flet data med 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()

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

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

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

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

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.

Flere nøglepar i R

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.

Eksempel på funktionen gather() i 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

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.