Introducción a la Combinación de Tablas (Joins)

En la gestión de bases de datos relacionales y el análisis estructurado, la información suele encontrarse fragmentada en múltiples tablas. El paquete dplyr proporciona dos familias principales de funciones para combinar datos a través de llaves comunes (keys):

  1. Mutating Joins (inner_join, left_join, right_join, full_join): Combinan columnas de ambas tablas emparejando filas según una coincidencia.
  2. Filtering Joins (semi_join, anti_join): Filtran las filas de la primera tabla según la presencia o ausencia de coincidencias en la segunda tabla (sin agregar columnas nuevas).
library(dplyr)
library(tibble)

Bases de Datos de Ejemplo

Para ilustrar de forma clara cada tipo de Join, crearemos dos datasets pequeños sobre estudiantes y cursos.

  • estudiantes: Contiene 5 alumnos. La estudiante Sofía tiene un id_curso = 5 (que no existe en la tabla de cursos).
  • cursos: Contiene 4 materias. El curso de Historia (id_curso = 4) no tiene ningún estudiante matriculado.
# Tabla Izquierda (x)
estudiantes <- tibble(
  id_alumno = c(101, 102, 103, 104, 105),
  nombre = c("Ana", "Carlos", "Elena", "David", "Sofía"),
  id_curso = c(1, 2, 2, 3, 5)
)

# Tabla Derecha (y)
cursos <- tibble(
  id_curso = c(1, 2, 3, 4),
  nombre_curso = c("Matemáticas", "Programación", "Economía", "Historia"),
  profesor = c("Dr. García", "Ing. López", "Dra. Martínez", "Lic. Fernández")
)

Tabla Izquierda: estudiantes

estudiantes

Tabla Derecha: cursos

cursos

1. Mutating Joins (Uniones de Modificación)

1.1 inner_join() — Coincidencias Exactas

Mantiene únicamente las filas que tienen coincidencia en ambas tablas.

X Y

Regla: Retorna solo las filas donde estudiantes$id_curso coincide con cursos$id_curso.

Excluidos: Sofía (curso 5) e Historia (curso 4).

estudiantes %>% 
  inner_join(cursos, by = "id_curso")

1.2 left_join() — Prioridad Tabla Izquierda

Mantiene todas las filas de la tabla izquierda (x). Si no hay coincidencia en la derecha (y), los campos se rellenan con NA.

X Y

Regla: Conserva a todos los estudiantes. Sofía permanece en el resultado pero muestra NA en el nombre del curso y profesor.

estudiantes %>% 
  left_join(cursos, by = "id_curso")

1.3 right_join() — Prioridad Tabla Derecha

Mantiene todas las filas de la tabla derecha (y). Si no hay coincidencia en la izquierda (x), los campos del estudiante se rellenan con NA.

X Y

Regla: Conserva todos los cursos. El curso Historia aparece, pero con los datos de alumno como NA.

estudiantes %>% 
  right_join(cursos, by = "id_curso")

1.4 full_join() — Unión Completa

Mantiene todas las filas de ambas tablas, rellenando con NA en cualquier lugar donde no exista coincidencia.

X Y

Regla: No se pierde ningún registro. Incluye tanto a Sofía como al curso de Historia.

estudiantes %>% 
  full_join(cursos, by = "id_curso")

2. Filtering Joins (Uniones de Filtrado)

A diferencia de los mutating joins, las uniones de filtrado nunca agregan nuevas columnas de la tabla derecha; solo filtran la tabla izquierda.

2.1 semi_join() — Filtra Coincidencias

Conserva las filas de x que tienen coincidencia en y.

X Y

Regla: Devuelve solo a los estudiantes asignados a un curso válido, pero sin incluir las columnas de la tabla cursos.

estudiantes %>% 
  semi_join(cursos, by = "id_curso")

2.2 anti_join() — Filtra Diferencias / Discordancias

Conserva las filas de x que NO tienen coincidencia en y. Es ideal para detectar discrepancias o registros huérfanos.

X Y

Regla: Identifica a Sofía porque su curso (5) no existe en la tabla de cursos.

estudiantes %>% 
  anti_join(cursos, by = "id_curso")

3. Nombres de Llaves Diferentes: by = c("key1" = "key2")

Si los identificadores tienen nombres distintos en cada tabla (por ejemplo, codigo_curso en lugar de id_curso), especificamos la equivalencia explícitamente:

# Crear copia con diferente nombre de columna
cursos_alt <- cursos %>% 
  rename(codigo_materia = id_curso)

# Unir especificando la relación entre columnas
estudiantes %>% 
  left_join(cursos_alt, by = c("id_curso" = "codigo_materia"))

4. Tabla Resumen

Función Tipo de Join Filas Conservadas Agrega Columnas de Y
inner_join() Mutating Solo coincidencias entre X e Y
left_join() Mutating Todas las filas de X
right_join() Mutating Todas las filas de Y
full_join() Mutating Todas las filas de X e Y
semi_join() Filtering Solo filas de X con coincidencia en Y No
anti_join() Filtering Solo filas de X sin coincidencia en Y No