Dplyr-veiledning: Slå sammen og slå sammen data i R med eksempler

Introduksjon til dataanalyse

Dataanalyse kan deles inn i tre deler:

  • Utvinning: Først må vi samle inn dataene fra mange kilder og kombinere dem.
  • Transform: Dette trinnet involverer datamanipulering. Når vi har konsolidert alle datakildene, kan vi begynne å rense dataene.
  • Visualisere: Det siste trekket er å visualisere dataene våre for å sjekke uregelmessigheter.
Dataanalyseprosess
Dataanalyseprosess

En av de viktigste utfordringene dataforskere står overfor er datamanipulering. Data er aldri tilgjengelig i ønsket format. Dataforskere må bruke minst halvparten av tiden sin på å rense og manipulere dataene. Det er en av de mest kritiske oppgavene i jobben. Hvis datamanipuleringsprosessen ikke er fullstendig, presis og streng, vil ikke modellen fungere korrekt.

R Dplyr

R har et bibliotek kalt dplyr for å hjelpe til med datatransformasjon. Dplyr-biblioteket er grunnleggende laget rundt fire funksjoner for å manipulere dataene og fem verb for å rense dataene. Etter det kan vi bruke ggplot-biblioteket til å analysere og visualisere dataene.

Vi vil lære hvordan du bruker dplyr-biblioteket til å manipulere en Dataramme.

Slå sammen data med R Dplyr

dplyr gir en fin og praktisk måte å kombinere datasett på. Vi kan ha mange kilder til inndata, og på et tidspunkt må vi kombinere dem. En sammenføyning med dplyr legger til variabler til høyre for det opprinnelige datasettet.

Dplyr blir med

Følgende er fire viktige typer sammenføyninger som brukes i dplyr for å slå sammen to datasett:

Funksjon Målet argumenter Flere taster
left_join() Slå sammen to datasett. Ta vare på alle observasjoner fra opprinnelsestabellen data, opprinnelse, destinasjon, av = "ID" opprinnelse, destinasjon, av = c(“ID”, “ID2”)
right_join() Slå sammen to datasett. Ta vare på alle observasjoner fra destinasjonstabellen data, opprinnelse, destinasjon, av = "ID" opprinnelse, destinasjon, av = c(“ID”, “ID2”)
inner_join() Slå sammen to datasett. Ekskluderer alle umatchede rader data, opprinnelse, destinasjon, av = "ID" opprinnelse, destinasjon, av = c(“ID”, “ID2”)
full_join() Slå sammen to datasett. Holder alle observasjoner data, opprinnelse, destinasjon, av = "ID" opprinnelse, destinasjon, av = c(“ID”, “ID2”)

Vi vil studere alle sammenføyningstypene via et enkelt eksempel.

Først av alt bygger vi to datasett. Tabell 1 inneholder to variabler, ID og y, mens tabell 2 samler ID og z. I hver situasjon må vi ha en nøkkel-par variabel. I vårt tilfelle er ID vår nøkkel variabel. Funksjonen vil se etter identiske verdier i begge tabellene og binde de returnerende verdiene til høyre for tabell 1.

Slå sammen 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 vanligste måten å slå sammen to datasett på er å bruke funksjonen left_join(). Vi kan se fra bildet nedenfor at nøkkelparet passer perfekt til radene A, B, C og D fra begge datasettene. Imidlertid er E og F til overs. Hvordan behandler vi disse to observasjonene? Med left_join() vil vi beholde alle variablene i den opprinnelige tabellen og ikke vurdere variablene som ikke har et nøkkelpar i måltabellen. I vårt eksempel eksisterer ikke variabelen E i tabell 1. Derfor vil raden bli slettet. Variabelen F kommer fra opprinnelsestabellen; den vil bli holdt etter left_join() og returnere NA i kolonnen z. Figuren nedenfor gjengir hva som vil skje med en left_join().

Eksempel på dplyr left_join()

Eksempel på dplyr left_join()

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

Utgang:

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

funksjonen right_join() fungerer akkurat som left_join(). Den eneste forskjellen er at raden er falt. Verdien E, tilgjengelig i destinasjonsdatarammen, finnes i den nye tabellen og tar verdien NA for kolonnen y.

Eksempel på dplyr right_join()

Eksempel på dplyr right_join()

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

Utgang:

##
# 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 datasettene ikke stemmer overens, kan vi vurdere å gå tilbake bare rader som eksisterer i både datasett. Dette er mulig når vi trenger et rent datasett eller når vi ikke vil tilskrive manglende verdier med gjennomsnittet eller medianen.

Inner_join() kommer for å hjelpe. Denne funksjonen ekskluderer radene som ikke samsvarer.

Eksempel på dplyr inner_join()

Eksempel på dplyr inner_join()

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

Utgang:

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

Til slutt beholder funksjonen full_join() alle observasjoner og erstatter manglende verdier med NA.

Eksempel på dplyr full_join()

Eksempel på dplyr full_join()

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

Utgang:

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

Sist, men ikke minst, kan vi ha flere nøkler i datasettet vårt. Tenk på følgende datasett der vi har år eller en liste over produkter kjøpt av kunden.

Flere nøkkelpar i R

Hvis vi prøver å slå sammen begge tabellene, gir R en feil. For å avhjelpe situasjonen kan vi sende to nøkkelparvariabler. Det vil si ID og årstall som vises i begge datasettene. Vi kan bruke følgende kode for å slå sammen tabell1 og tabell 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'))

Utgang:

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

Datarensefunksjoner i R

Følgende er de fire viktige funksjonene for å rydde (rense) dataene:

Funksjon Målet argumenter
samle() Transformer dataene fra brede til lange (data, nøkkel, verdi, na.rm = FALSE)
spre() Transformer dataene fra lange til brede (data, nøkkel, verdi)
skille() Del en variabel i to (data, col, into, sep= “”, remove = TRUE)
enhet() Enhet to variabler til én (data, col, conc ,sep= “”, remove = TRUE)

Vi bruker tidyr-biblioteket. Dette biblioteket tilhører samlingen til biblioteket for å manipulere, rense og visualisere dataene. Hvis vi installerer R med anaconda, er biblioteket allerede installert. Vi finner biblioteket her, https://anaconda.org/r/r-tidyr.

Hvis den ikke allerede er installert, skriv inn følgende kommando for å installere tidyr:

install tidyr : install.packages("tidyr")

samle()

Målet med gather()-funksjonen er å transformere dataene fra brede til lange.

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

Eksempel

Nedenfor kan vi visualisere konseptet med å omforme bredt til langt. Vi ønsker å lage en enkelt kolonne kalt vekst, fylt av radene i kvartalsvariablene.

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

Utgang:

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

Utgang:

##    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 gather()-funksjonen oppretter vi to nye variable kvartal og vekst fordi vårt originale datasett har én gruppevariabel: dvs. land og nøkkelverdi-parene.

spre()

Spread()-funksjonen gjør det motsatte av gather.

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

Eksempel

Vi kan omforme det ryddigere datasettet tilbake til rotete med spread()

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

Utgang:

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

skille()

Separate()-funksjonen deler en kolonne i to i henhold til en separator. Denne funksjonen er nyttig i enkelte situasjoner der variabelen er en dato. Analysen vår kan kreve fokus på måned og år, og vi ønsker å dele kolonnen i to nye variabler.

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.

Eksempel

Vi kan dele kvartalet fra året i det ryddigere datasettet ved å bruke separat()-funksjonen.

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

Utgang:

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

Unite()-funksjonen setter sammen to kolonner til én.

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

Eksempel

I eksemplet ovenfor skilte vi kvartal fra år. Hva om vi ønsker å slå dem sammen. Vi bruker følgende kode:

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

Utgang:

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

Sammendrag

  • Dataanalyse kan deles inn i tre deler: uttrekk, transformere og visualisere.
  • R har et bibliotek kalt dplyr for å hjelpe til med datatransformasjon. Dplyr-biblioteket er grunnleggende laget rundt fire funksjoner for å manipulere dataene og fem verb for å rense dataene.
  • dplyr gir en fin og praktisk måte å kombinere datasett på. En sammenføyning med dplyr legger til variabler til høyre for det opprinnelige datasettet.
  • Det fine med dplyr er at den håndterer fire typer sammenføyninger som ligner på SQL:
    • left_join() – Å slå sammen to datasett og beholde alle observasjoner fra opprinnelsestabellen.
    • right_join() – Å slå sammen to datasett og beholde alle observasjoner fra måltabellen.
    • inner_join() – For å slå sammen to datasett og ekskludere alle umatchede rader.
    • full_join() – Å slå sammen to datasett og beholde alle observasjoner.
  • Ved å bruke tidyr-biblioteket kan du transformere et datasett ved å bruke følgende funksjoner:
    • samle(): Transformer dataene fra brede til lange.
    • spre(): Transformer dataene fra lange til brede.
    • skille(): Del en variabel i to.
    • enhet(): Enhet to variabler til én.