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.

