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.