Unisci frame di dati in R: corrispondenza completa e parziale
Molto spesso disponiamo di dati provenienti da piรน fonti. Per eseguire un'analisi, dobbiamo unire due dataframe insieme ad uno o piรน variabili chiave comuni.
In questo tutorial imparerai
Partita intera
Una corrispondenza completa restituisce valori che hanno una controparte nella tabella di destinazione. I valori che non corrispondono non verranno restituiti nel nuovo frame di dati. La corrispondenza parziale, tuttavia, restituisce i valori mancanti come NA.
Ne vedremo una semplice join interno. La parola chiave inner join seleziona i record che presentano valori corrispondenti in entrambe le tabelle. Per unire due set di dati, possiamo usare la funzione merge(). Utilizzeremo tre argomenti:
merge(x, y, by.x = x, by.y = y) Arguments: -x: The origin data frame -y: The data frame to merge -by.x: The column used for merging in x data frame. Column x to merge on -by.y: The column used for merging in y data frame. Column y to merge on
Esempio:
Crea il primo set di dati con variabili
- cognome
- nazionalitร
Crea un secondo set di dati con variabili
- cognome
- film
La variabile chiave comune รจ il cognome. Possiamo unire entrambi i dati e verificare se la dimensionalitร รจ 7ร3.
Aggiungiamo stringsAsFactors=FALSE nel data frame perchรฉ non vogliamo R per convertire una stringa come fattore, vogliamo che la variabile venga trattata come un carattere.
# Create origin dataframe(
producers <- data.frame(
surname = c("Spielberg","Scorsese","Hitchcock","Tarantino","Polanski"),
nationality = c("US","US","UK","US","Poland"),
stringsAsFactors=FALSE)
# Create destination dataframe
movies <- data.frame(
surname = c("Spielberg",
"Scorsese",
"Hitchcock",
"Hitchcock",
"Spielberg",
"Tarantino",
"Polanski"),
title = c("Super 8",
"Taxi Driver",
"Psycho",
"North by Northwest",
"Catch Me If You Can",
"Reservoir Dogs","Chinatown"),
stringsAsFactors=FALSE)
# Merge two datasets
m1 <- merge(producers, movies, by.x = "surname")
m1
dim(m1)
Produzione:
surname nationality title 1 Hitchcock UK Psycho 2 Hitchcock UK North by Northwest 3 Polanski Poland Chinatown 4 Scorsese US Taxi Driver 5 Spielberg US Super 8 6 Spielberg US Catch Me If You Can 7 Tarantino US Reservoir Dogs
Uniamo i frame di dati quando le variabili chiave comuni hanno nomi diversi.
Cambiamo il cognome in nome nel frame dati del film. Usiamo la funzione identico(x1, x2) per verificare se entrambi i frame di dati sono identici.
# Change name of ` movies ` dataframe colnames(movies)[colnames(movies) == 'surname'] <- 'name' # Merge with different key value m2 <- merge(producers, movies, by.x = "surname", by.y = "name") # Print head of the data head(m2)
Produzione:
##surname nationality title ## 1 Hitchcock UK Psycho ## 2 Hitchcock UK North by Northwest ## 3 Polanski Poland Chinatown ## 4 Scorsese US Taxi Driver ## 5 Spielberg US Super 8 ## 6 Spielberg US Catch Me If You Can
# Check if data are identical identical(m1, m2)
Produzione:
## [1] TRUE
Ciรฒ dimostra che l'operazione di unione viene eseguita anche se i nomi delle colonne sono diversi.
Corrispondenza parziale
Non sorprende che due dataframe non abbiano le stesse variabili chiave comuni. Nel corrispondenza completa, il dataframe restituisce esclusivamente righe trovate in entrambi i frame di dati x e y. Con fusione parziale, รจ possibile mantenere le righe senza righe corrispondenti nell'altro frame di dati. Queste righe avranno NA in quelle colonne che solitamente sono riempite con valori da y. Possiamo farlo impostando all.x= TRUE.
Ad esempio, possiamo aggiungere un nuovo produttore, Lucas, nel frame dati del produttore senza i riferimenti al film nel frame dati del film. Se impostiamo all.x= FALSE, R unirร solo i valori corrispondenti in entrambi i set di dati. Nel nostro caso, il produttore Lucas non verrร aggiunto alla fusione perchรฉ manca da un set di dati.
Vediamo la dimensione di ciascun output quando specifichiamo all.x= TRUE e quando non lo facciamo.
# Create a new producer
add_producer <- c('Lucas', 'US')
# Append it to the ` producer` dataframe
producers <- rbind(producers, add_producer)
# Use a partial merge
m3 <-merge(producers, movies, by.x = "surname", by.y = "name", all.x = TRUE)
m3
Produzione:
# Compare the dimension of each data frame dim(m1)
Produzione:
## [1] 7 3
dim(m2)
Produzione:
## [1] 7 3
dim(m3)
Produzione:
## [1] 8 3
Come possiamo vedere, la dimensione del nuovo data frame รจ 8ร3 rispetto a 7ร3 per m1 e m2. R include NA per l'autore mancante nel frame dati del libro.

