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:

Coincidencia parcial

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

Resumir este post con: