Îmbinați cadre de date în R: potrivire completă și parțială

Foarte des, avem date din mai multe surse. Pentru a efectua o analiză, trebuie îmbina două cadre de date împreună cu unul sau mai multe variabile cheie comune.

În acest tutorial, veți învăța

Meci intreg

O potrivire completă returnează valori care au o contrapartidă în tabelul de destinație. Valorile care nu se potrivesc nu vor fi returnate în noul cadru de date. Potrivirea parțială, totuși, returnează valorile lipsă ca NA.

Vom vedea un simplu îmbinare interioară. Cuvântul cheie de unire interioară selectează înregistrările care au valori care se potrivesc în ambele tabele. Pentru a uni două seturi de date, putem folosi funcția merge(). Vom folosi trei argumente:

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

Exemplu:

Creați primul set de date cu variabile

  • nume de familie
  • naționalitate

Creați al doilea set de date cu variabile

  • nume de familie
  • filme

Variabila cheie comună este numele de familie. Putem îmbina ambele date și putem verifica dacă dimensionalitatea este 7×3.

Adăugăm stringsAsFactors=FALSE în cadrul de date pentru că nu vrem R pentru a converti șirul ca factor, dorim ca variabila să fie tratată ca caracter.

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

ieșire:

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

Să îmbinăm cadrele de date când variabilele cheie comune au nume diferite.

Schimbăm numele de familie cu numele în cadrul de date al filmelor. Folosim funcția identical(x1, x2) pentru a verifica dacă ambele cadre de date sunt identice.

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

ieșire:

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

ieșire:

## [1] TRUE

Aceasta arată că operația de îmbinare este efectuată chiar dacă numele coloanelor sunt diferite.

Potrivire parțială

Nu este surprinzător faptul că două cadre de date nu au aceleași variabile cheie comune. În potrivire completă, cadrul de date revine rânduri găsite în cadrul de date x și y. Cu contopirea parțială, este posibil să păstrați rândurile fără rânduri care se potrivesc în celălalt cadru de date. Aceste rânduri vor avea NA în acele coloane care sunt de obicei umplute cu valori de la y. Putem face asta setând all.x= TRUE.

De exemplu, putem adăuga un nou producător, Lucas, în cadrul de date al producătorului fără referințele de film în cadrul de date ale filmelor. Dacă setăm all.x= FALSE, R va uni numai valorile care se potrivesc în ambele seturi de date. În cazul nostru, producătorul Lucas nu se va alătura fuziunii, deoarece lipsește dintr-un set de date.

Să vedem dimensiunea fiecărei ieșiri atunci când specificăm all.x= TRUE și când nu.

# 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

ieșire:

Potrivire parțială

# Compare the dimension of each data frame
dim(m1)

ieșire:

## [1] 7 3
dim(m2)

ieșire:

## [1] 7 3
dim(m3)

ieșire:

## [1] 8 3

După cum putem vedea, dimensiunea noului cadru de date 8×3 în comparație cu 7×3 pentru m1 și m2. R include NA pentru autorul lipsă în cadrul de date al cărților.