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