Tutorial Dplyr: unisci e unisci dati in R con esempi

Introduzione all'analisi dei dati

L’analisi dei dati può essere divisa in tre parti:

  • Estrazione: Innanzitutto, dobbiamo raccogliere i dati da molte fonti e combinarli.
  • Trasformare: Questo passaggio prevede la manipolazione dei dati. Una volta consolidate tutte le fonti di dati, possiamo iniziare a pulire i dati.
  • Visualizzare: L'ultima mossa è visualizzare i nostri dati per verificare l'irregolarità.
Processo di analisi dei dati
Processo di analisi dei dati

Una delle sfide più significative affrontate dai data scientist è la manipolazione dei dati. I dati non sono mai disponibili nel formato desiderato. I data scientist devono dedicare almeno la metà del loro tempo alla pulizia e alla manipolazione dei dati. Questo è uno degli incarichi più critici del lavoro. Se il processo di manipolazione dei dati non è completo, preciso e rigoroso, il modello non funzionerà correttamente.

R Dplir

R ha una libreria chiamata dplyr per aiutare nella trasformazione dei dati. La libreria dplyr è fondamentalmente creata attorno a quattro funzioni per manipolare i dati e cinque verbi per pulire i dati. Successivamente, possiamo utilizzare la libreria ggplot per analizzare e visualizzare i dati.

Impareremo come utilizzare la libreria dplyr per manipolare a Cornice dati.

Unisci i dati con R Dplyr

dplyr fornisce un modo piacevole e conveniente per combinare i set di dati. Potremmo avere molte fonti di dati di input e, a un certo punto, dobbiamo combinarle. Un join con dplyr aggiunge variabili a destra del set di dati originale.

Dplyr si unisce

Di seguito sono riportati quattro importanti tipi di join utilizzati in dplyr per unire due set di dati:

Funzione Obiettivo argomenti Chiavi multiple
left_join() Unisci due set di dati. Conserva tutte le osservazioni dalla tabella di origine dati, origine, destinazione, per = “ID” origine, destinazione, per = c(“ID”, “ID2”)
right_join() Unisci due set di dati. Conserva tutte le osservazioni dalla tabella di destinazione dati, origine, destinazione, per = “ID” origine, destinazione, per = c(“ID”, “ID2”)
inner_join() Unisci due set di dati. Esclude tutte le righe senza corrispondenza dati, origine, destinazione, per = “ID” origine, destinazione, per = c(“ID”, “ID2”)
full_join() Unisci due set di dati. Mantiene tutte le osservazioni dati, origine, destinazione, per = “ID” origine, destinazione, per = c(“ID”, “ID2”)

Studieremo tutti i tipi di join tramite un semplice esempio.

Prima di tutto, creiamo due set di dati. La Tabella 1 contiene due variabili, ID e y, mentre la Tabella 2 raccoglie ID e z. In ogni situazione, dobbiamo avere a coppia di chiavi variabile. Nel nostro caso, l'ID è our chiave variabile. La funzione cercherà valori identici in entrambe le tabelle e legherà i valori restituiti a destra della tabella 1.

Unisci i dati con 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()

Il modo più comune per unire due set di dati è utilizzare la funzione left_join(). Possiamo vedere dall'immagine qui sotto che la coppia di chiavi corrisponde perfettamente alle righe A, B, C e D di entrambi i set di dati. Tuttavia, E ed F rimangono. Come trattiamo queste due osservazioni? Con left_join(), manterremo tutte le variabili nella tabella originale e non considereremo le variabili che non hanno una coppia di chiavi nella tabella di destinazione. Nel nostro esempio, la variabile E non esiste nella tabella 1. Pertanto, la riga verrà eliminata. La variabile F proviene dalla tabella di origine; verrà mantenuto dopo left_join() e restituirà NA nella colonna z. La figura seguente riproduce cosa accadrà con un left_join().

Esempio di dplyr left_join()

Esempio di dplyr left_join()

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

Produzione:

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

La funzione right_join() funziona esattamente come left_join(). L'unica differenza è la riga eliminata. Il valore E, disponibile nel data frame di destinazione, esiste nella nuova tabella e assume il valore NA per la colonna y.

Esempio di dplyr right_join()

Esempio di dplyr right_join()

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

Produzione:

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

Quando siamo sicuri al 100% che i due set di dati non corrisponderanno, possiamo considerare di restituire esclusivamente righe esistenti in entrambi set di dati. Ciò è possibile quando abbiamo bisogno di un set di dati pulito o quando non vogliamo imputare i valori mancanti con la media o la mediana.

inner_join() viene in aiuto. Questa funzione esclude le righe senza corrispondenza.

Esempio di dplyr inner_join()

Esempio di dplyr inner_join()

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

Produzione:

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

Infine, la funzione full_join() mantiene tutte le osservazioni e sostituisce i valori mancanti con NA.

Esempio di dplyr full_join()

Esempio di dplyr full_join()

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

Produzione:

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

Coppie di chiavi multiple

Ultimo ma non meno importante, possiamo avere più chiavi nel nostro dataset. Considerate il seguente dataset in cui abbiamo anni o un elenco di prodotti acquistati dal cliente.

Coppie di chiavi multiple in R

Se proviamo a unire entrambe le tabelle, R genera un errore. Per porre rimedio alla situazione, possiamo passare due variabili coppia-chiave. Ovvero, ID e anno che compaiono in entrambi i dataset. Possiamo usare il seguente codice per unire table1 e table 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'))

Produzione:

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

Funzioni di pulizia dei dati in R

Di seguito sono riportate le quattro funzioni importanti per riordinare (pulire) i dati:

Funzione Obiettivo argomenti
raccogliere() Trasforma i dati da larghi a lunghi (dati, chiave, valore, na.rm = FALSE)
diffusione() Trasforma i dati da lunghi a larghi (dati, chiave, valore)
separato() Dividere una variabile in due (data, col, into, sep= “”, rimuovi = TRUE)
unità() Unisci due variabili in una (dati, col, conc, sep= “”, rimuovi = TRUE)

Usiamo la libreria tidyr. Questa libreria appartiene alla collezione della libreria per manipolare, pulire e visualizzare i dati. Se installiamo R con anaconda, la libreria è già installata. Possiamo trovare la biblioteca qui, https://anaconda.org/r/r-tidyr.

Se non è già installato, immettere il seguente comando per installare tidyr:

install tidyr : install.packages("tidyr")

raccogliere()

L'obiettivo della funzione raccogli() è trasformare i dati da ampi a lunghi.

Sintassi

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

Esempio

Di seguito, possiamo visualizzare il concetto di rimodellamento da largo a lungo. Vogliamo creare un'unica colonna denominata crescita, riempita dalle righe delle variabili del trimestre.

Esempio della funzione raccogli() 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

Produzione:

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

Produzione:

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

Nella funzione raccogli() creiamo due nuove variabili trimestre e crescita perché il nostro set di dati originale ha una variabile di gruppo: ovvero paese e coppie chiave-valore.

diffusione()

La funzione spread() fa l'opposto di raccogliere.

Sintassi

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

Esempio

Possiamo rimodellare il set di dati più ordinato in modo disordinato con spread()

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

Produzione:

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

separato()

La funzione separate() divide una colonna in due secondo un separatore. Questa funzione è utile in alcune situazioni in cui la variabile è una data. La nostra analisi può richiedere di concentrarsi su mese e anno e vogliamo separare la colonna in due nuove variabili.

Sintassi

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.

Esempio

Possiamo dividere il trimestre dall'anno nel set di dati più ordinato applicando la funzione separate().

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

Produzione:

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

unire()

La funzione unite() concana due colonne in una.

Sintassi

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

Esempio

Nell'esempio sopra, abbiamo separato trimestre da anno. E se volessimo unirli? Utilizziamo il seguente codice:

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

Produzione:

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

Sommario

  • L'analisi dei dati può essere diviso in tre parti: Estrazione, Trasformazione e Visualizzazione.
  • R ha una libreria chiamata dplyr per aiutare nella trasformazione dei dati. La libreria dplyr è fondamentalmente creata attorno a quattro funzioni per manipolare i dati e cinque verbi per pulire i dati.
  • dplyr fornisce un modo piacevole e conveniente per combinare i set di dati. Un join con dplyr aggiunge variabili a destra del set di dati originale.
  • La bellezza di dplyr è che gestisce quattro tipi di join simili a SQL:
    • left_join() – Per unire due set di dati e conservare tutte le osservazioni dalla tabella di origine.
    • right_join() – Per unire due set di dati e conservare tutte le osservazioni dalla tabella di destinazione.
    • inner_join() – Per unire due set di dati ed escludere tutte le righe senza corrispondenze.
    • full_join() – Per unire due set di dati e conservare tutte le osservazioni.
  • Utilizzando la libreria tidyr, è possibile trasformare un set di dati utilizzando le seguenti funzioni:
    • raccogliere(): trasforma i dati da larghi a lunghi.
    • diffusione(): trasforma i dati da lunghi a larghi.
    • separato(): divide una variabile in due.
    • unità(): Unisci due variabili in una.