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.

Riassumi questo post con: