Dplyr-zelfstudie: gegevens samenvoegen en samenvoegen in R met voorbeelden

Inleiding tot gegevensanalyse

Data-analyse kan in drie delen worden verdeeld:

  • Afkomst: Ten eerste moeten we de gegevens uit vele bronnen verzamelen en combineren.
  • Transformeren: Deze stap omvat de gegevensmanipulatie. Zodra we alle gegevensbronnen hebben geconsolideerd, kunnen we beginnen met het opschonen van de gegevens.
  • Visualiseer: De laatste stap is het visualiseren van onze gegevens om onregelmatigheden te controleren.
Gegevensanalyseproces
Gegevensanalyseproces

Een van de grootste uitdagingen waarmee datawetenschappers worden geconfronteerd, is de datamanipulatie. Gegevens zijn nooit in het gewenste formaat beschikbaar. Datawetenschappers moeten minstens de helft van hun tijd besteden aan het opschonen en manipuleren van de gegevens. Dat is een van de meest cruciale opdrachten in de baan. Als het gegevensmanipulatieproces niet volledig, nauwkeurig en rigoureus is, zal het model niet correct functioneren.

R Dplyr

R heeft een bibliotheek genaamd dplyr om te helpen bij gegevenstransformatie. De dplyr-bibliotheek is fundamenteel opgebouwd rond vier functies om de gegevens te manipuleren en vijf werkwoorden om de gegevens op te schonen. Daarna kunnen we de ggplot-bibliotheek gebruiken om de gegevens te analyseren en visualiseren.

We zullen leren hoe we de dplyr-bibliotheek kunnen gebruiken om a Gegevensframe.

Gegevens samenvoegen met R Dplyr

dplyr biedt een leuke en handige manier om datasets te combineren. We hebben mogelijk veel bronnen van invoergegevens en op een gegeven moment moeten we ze combineren. Een join met dplyr voegt variabelen toe aan de rechterkant van de oorspronkelijke gegevensset.

Dplyr sluit zich aan

Hieronder staan ​​vier belangrijke typen joins die in dplyr worden gebruikt om twee datasets samen te voegen:

Functie Objectief argumenten Meerdere sleutels
left_join() Voeg twee datasets samen. Bewaar alle waarnemingen uit de oorsprongstabel gegevens, herkomst, bestemming, door = “ID” herkomst, bestemming, door = c(“ID”, “ID2”)
right_join() Voeg twee datasets samen. Bewaar alle waarnemingen uit de bestemmingstabel gegevens, herkomst, bestemming, door = “ID” herkomst, bestemming, door = c(“ID”, “ID2”)
innerlijke_join() Voeg twee datasets samen. Sluit alle niet-overeenkomende rijen uit gegevens, herkomst, bestemming, door = “ID” herkomst, bestemming, door = c(“ID”, “ID2”)
volledige_join() Voeg twee datasets samen. Houdt alle observaties bij gegevens, herkomst, bestemming, door = “ID” herkomst, bestemming, door = c(“ID”, “ID2”)

We zullen alle join-typen bestuderen aan de hand van een eenvoudig voorbeeld.

Allereerst bouwen we twee datasets. Tabel 1 bevat twee variabelen, ID en y, terwijl Tabel 2 ID en z verzamelt. In elke situatie hebben we een sleutelpaar variabel. In ons geval is ID onze sleutel variabel. De functie zoekt naar identieke waarden in beide tabellen en bindt de geretourneerde waarden rechts van tabel 1.

Gegevens samenvoegen met 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()

De meest gebruikelijke manier om twee datasets samen te voegen is door de functie left_join() te gebruiken. We kunnen op de onderstaande afbeelding zien dat het sleutelpaar perfect overeenkomt met de rijen A, B, C en D uit beide datasets. E en F blijven echter over. Hoe moeten we deze twee observaties behandelen? Met de left_join() behouden we alle variabelen in de oorspronkelijke tabel en houden we geen rekening met de variabelen die geen sleutelpaar hebben in de doeltabel. In ons voorbeeld bestaat de variabele E niet in tabel 1. Daarom wordt de rij verwijderd. De variabele F komt uit de oorsprongstabel; het wordt bewaard na de left_join() en retourneert NA in de kolom z. De onderstaande afbeelding reproduceert wat er zal gebeuren met een left_join().

Voorbeeld van dplyr left_join()

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

De functie right_join() werkt precies zoals left_join(). Het enige verschil is dat de rij is geschrapt. De waarde E, beschikbaar in het doelgegevensframe, bestaat in de nieuwe tabel en neemt de waarde NA aan voor de kolom y.

Voorbeeld van dplyr right_join()

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

Als we er 100% zeker van zijn dat de twee datasets niet overeenkomen, kunnen we overwegen om terug te keren Slechts rijen die bestaan ​​in zowel gegevensset. Dit is mogelijk als we een schone dataset nodig hebben of als we ontbrekende waarden niet willen toeschrijven aan het gemiddelde of de mediaan.

De inner_join() komt te hulp. Deze functie sluit de niet-overeenkomende rijen uit.

Voorbeeld van dplyr inner_join()

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

Ten slotte bewaart de functie full_join() alle waarnemingen en vervangt ontbrekende waarden door NA.

Voorbeeld van dplyr full_join()

Voorbeeld van 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

Meerdere sleutelparen

Last but not least kunnen we meerdere sleutels in onze dataset hebben. Denk aan de volgende dataset waar we jaren of een lijst met producten hebben die door de klant zijn gekocht.

Meerdere sleutelparen in R

Als we proberen beide tabellen samen te voegen, geeft R een fout. Om de situatie te verhelpen, kunnen we twee sleutelpaarvariabelen doorgeven. Dat wil zeggen, ID en jaar die in beide datasets voorkomen. We kunnen de volgende code gebruiken om tabel 1 en tabel 2 samen te voegen

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

Gegevensopschoonfuncties in R

Hieronder staan ​​de vier belangrijkste functies om gegevens op te schonen:

Functie Objectief argumenten
bijeenkomen() Transformeer de gegevens van breed naar lang (gegevens, sleutel, waarde, na.rm = FALSE)
spreiding() Transformeer de gegevens van lang naar breed (gegevens, sleutel, waarde)
verschillend() Splits één variabele in twee (data, col, into, sep= “”, verwijderen = TRUE)
eenheid() Verenig twee variabelen tot één (data, col, conc ,sep= “”, verwijderen = WAAR)

Wij maken gebruik van de opgeruimde bibliotheek. Deze bibliotheek behoort tot de collectie van de bibliotheek om de data te manipuleren, op te schonen en te visualiseren. Als we R met anaconda installeren, is de bibliotheek al geïnstalleerd. We kunnen de bibliotheek hier vinden, https://anaconda.org/r/r-tidyr.

Als het nog niet is geïnstalleerd, voer dan de volgende opdracht in om tidyr te installeren:

install tidyr : install.packages("tidyr")

bijeenkomen()

Het doel van de functie collect() is om de gegevens van breed naar lang te transformeren.

Syntaxis

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

Voorbeeld

Hieronder kunnen we het concept van het hervormen van breed naar lang visualiseren. We willen een enkele kolom maken met de naam groei, gevuld met de rijen van de kwartaalvariabelen.

Voorbeeld van de functie collect() in 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

In de functie collect() creëren we twee nieuwe variabelen kwartaal en groei omdat onze oorspronkelijke dataset één groepsvariabele heeft: dat wil zeggen land en de sleutel-waardeparen.

spreiding()

De functie spread() doet het tegenovergestelde van verzamelen.

Syntaxis

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

Voorbeeld

We kunnen de opgeruimde dataset weer rommelig maken met 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

verschillend()

De functie separator() splitst een kolom in twee volgens een scheidingsteken. Deze functie is handig in sommige situaties waarin de variabele een datum is. Voor onze analyse kan het nodig zijn dat we ons concentreren op maand en jaar en we willen de kolom opdelen in twee nieuwe variabelen.

Syntaxis

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.

Voorbeeld

We kunnen het kwartaal van het jaar splitsen in de overzichtelijkere dataset door de functie separate() toe te passen.

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

verenigen()

De functie unite() voegt twee kolommen samen tot één.

Syntaxis

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

Voorbeeld

In het bovenstaande voorbeeld hebben we kwartaal van jaar gescheiden. Wat als we ze willen samenvoegen? We gebruiken de volgende code:

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

Samenvatting

  • Data-analyse kan worden onderverdeeld in drie delen: Extractie, Transformeren en Visualiseren.
  • R heeft een bibliotheek genaamd dplyr om te helpen bij gegevenstransformatie. De dplyr-bibliotheek is fundamenteel opgebouwd rond vier functies om de gegevens te manipuleren en vijf werkwoorden om de gegevens op te schonen.
  • dplyr biedt een leuke en handige manier om datasets te combineren. Een join met dplyr voegt variabelen toe aan de rechterkant van de oorspronkelijke gegevensset.
  • Het mooie van dplyr is dat het vier soorten joins verwerkt die vergelijkbaar zijn met SQL:
    • left_join() – Om twee datasets samen te voegen en alle waarnemingen uit de oorsprongstabel te behouden.
    • right_join() – Om twee datasets samen te voegen en alle observaties uit de doeltabel te behouden.
    • innerlijke_join() – Om twee datasets samen te voegen en alle niet-overeenkomende rijen uit te sluiten.
    • volledige_join() – Om twee datasets samen te voegen en alle observaties te behouden.
  • Met behulp van de tidyr-bibliotheek kunt u een dataset transformeren met behulp van de volgende functies:
    • bijeenkomen(): Transformeer de gegevens van breed naar lang.
    • spreiding(): Transformeer de gegevens van lang naar breed.
    • verschillend(): Splits één variabele in twee.
    • eenheid(): Eenheid van twee variabelen in één.