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:

Partita parziale

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