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

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