Fusionar marcos de datos en R: coincidencia total y parcial
Muy a menudo disponemos de datos de mรบltiples fuentes. Para realizar un anรกlisis es necesario unir dos marcos de datos junto con uno o mรกs variables clave comunes.
En este tutorial, aprenderรก
Partido completo
Una coincidencia completa devuelve valores que tienen una contraparte en la tabla de destino. Los valores que no coincidan no se devolverรกn en el nuevo marco de datos. La coincidencia parcial, sin embargo, devuelve los valores faltantes como NA.
Veremos una sencilla uniรณn interna. La palabra clave de uniรณn interna selecciona registros que tienen valores coincidentes en ambas tablas. Para unir dos conjuntos de datos, podemos usar la funciรณn merge(). Usaremos tres argumentos:
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
Ejemplo:
Crear el primer conjunto de datos con variables
- apellido
- nacionalidad
Crear un segundo conjunto de datos con variables
- apellido
- pelรญculas
La variable clave comรบn es el apellido. Podemos fusionar ambos datos y comprobar si la dimensionalidad es 7ร3.
Agregamos stringsAsFactors=FALSE en el marco de datos porque no queremos R Para convertir una cadena como factor, queremos que la variable se trate como un carรกcter.
# 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)
Salida:
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
Fusionemos marcos de datos cuando las variables clave comunes tengan nombres diferentes.
Cambiamos el apellido por el nombre en el marco de datos de las pelรญculas. Usamos la funciรณn idรฉntica (x1, x2) para verificar si ambos marcos de datos son idรฉnticos.
# 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)
Salida:
##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)
Salida:
## [1] TRUE
Esto demuestra que la operaciรณn de combinaciรณn se realiza incluso si los nombres de las columnas son diferentes.
Coincidencia parcial
No es sorprendente que dos marcos de datos no tengan las mismas variables clave comunes. En el coincidencia completa, el marco de datos regresa รบnico filas encontradas en el marco de datos x e y. Con fusiรณn parcial, es posible mantener las filas que no coincidan en el otro marco de datos. Estas filas tendrรกn NA en aquellas columnas que normalmente se llenan con valores de y. Podemos hacerlo configurando all.x= TRUE.
Por ejemplo, podemos agregar un nuevo productor, Lucas, en el marco de datos del productor sin las referencias de pelรญculas en el marco de datos de las pelรญculas. Si configuramos all.x= FALSE, R unirรก solo los valores coincidentes en ambos conjuntos de datos. En nuestro caso, el productor Lucas no se unirรก a la fusiรณn porque falta en un conjunto de datos.
Veamos la dimensiรณn de cada salida cuando especificamos all.x= TRUE y cuando no lo hacemos.
# 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
Salida:
# Compare the dimension of each data frame dim(m1)
Salida:
## [1] 7 3
dim(m2)
Salida:
## [1] 7 3
dim(m3)
Salida:
## [1] 8 3
Como podemos ver, la dimensiรณn del nuevo marco de datos es 8ร3 en comparaciรณn con 7ร3 para m1 y m2. R incluye NA para el autor que falta en el marco de datos del libro.

