0Pricing
R Academy · Lección

Uniones entre varias tablas en dplyr

Domine inner_join, left_join, right_join, full_join y anti_join.

Uniones entre varias tablas en dplyr es una lección gratuita de R Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

¿Por qué unir tablas?

Los datos reales rara vez se encuentran en una sola tabla. Las bases de datos relacionales distribuyen la información en varias tablas para evitar repeticiones. Las uniones permiten combinar tablas según claves compartidas. dplyr proporciona funciones de unión al estilo de SQL con una sintaxis clara y legible.

library(dplyr)

# Two related tables
orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 3),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = 1:3,
  name = c('Alice','Bob','Carol'),
  city = c('NYC','LA','Chicago')
)

print(orders)
print(customers)

inner_join() — Solo filas coincidentes

inner_join(x, y, by='key') devuelve únicamente las filas cuya clave existe en ambas tablas. Las filas sin coincidencia en la otra tabla se eliminan. Este es el tipo de unión más común.

library(dplyr)

orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 99),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# customer_id = 99 in orders has no match => dropped
# customer_id = 3 in customers has no match => dropped
inner_join(orders, customers, by = 'customer_id')

left_join() — Conservar todas las filas de la izquierda

left_join(x, y, by='key') conserva todas las filas de x y completa los datos coincidentes de y. Las filas de x sin coincidencia en y reciben NA en las columnas de y. La tabla izquierda determina el resultado.

library(dplyr)

orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 99),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# Order with customer_id=99 is kept, name = NA
left_join(orders, customers, by = 'customer_id')

right_join() — Conservar todas las filas de la derecha

right_join(x, y, by='key') conserva todas las filas de y. Las filas de y sin coincidencia en x reciben NA en las columnas de x. Es el reflejo de left_join() — se usa menos porque se puede invertir el orden de las tablas.

library(dplyr)

orders <- data.frame(
  order_id = c(1, 2),
  customer_id = c(1, 2),
  amount = c(250, 180)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# Carol (customer_id=3) has no orders => NA for order columns
right_join(orders, customers, by = 'customer_id')

full_join() — Conservar todas las filas

full_join(x, y, by='key') conserva todas las filas de ambas tablas. Las filas sin coincidencia de cualquiera de las dos tablas reciben NA en las columnas de la otra tabla. Se usa cuando no se puede perder ningún dato.

library(dplyr)

q1 <- data.frame(product = c('A','B','C'), q1_sales = c(100, 200, 150))
q2 <- data.frame(product = c('A','C','D'), q2_sales = c(120, 160, 90))

# D appears only in q2, B only in q1 => both kept
full_join(q1, q2, by = 'product')

anti_join() — Encontrar las no coincidencias

anti_join(x, y, by='key') devuelve las filas de x que no tienen coincidencia en y. No incluye ninguna columna de y. Es ideal para encontrar registros huérfanos, pedidos sin coincidencia o elementos ausentes en una tabla de referencia.

library(dplyr)

all_employees <- data.frame(
  id = 1:5,
  name = c('Alice','Bob','Carol','Dave','Eve')
)

trained <- data.frame(id = c(1, 3, 5))

# Who has NOT completed training?
anti_join(all_employees, trained, by = 'id')

semi_join() — Filtrar por coincidencia

semi_join(x, y, by='key') devuelve las filas de x que tienen una coincidencia en y, pero NO añade las columnas de y. Es como inner_join(), pero solo devuelve las columnas de x; resulta útil como paso de filtrado.

library(dplyr)

products <- data.frame(
  id = 1:5,
  name = c('Widget','Gadget','Donut','Gizmo','Sprocket'),
  price = c(9.99, 24.99, 1.99, 14.99, 4.99)
)

ordered_products <- data.frame(id = c(1, 3, 5))

# Products that appear in at least one order
semi_join(products, ordered_products, by = 'id')

Unir con nombres de columna diferentes

Cuando las columnas clave tienen nombres diferentes en x y en y, use la sintaxis by = c('x_col' = 'y_col'). Esto asigna el nombre de la columna de la tabla izquierda a la columna correspondiente de la tabla derecha.

library(dplyr)

orders <- data.frame(
  order_id = 1:3,
  user_id = c(10, 20, 10),
  amount = c(100, 200, 150)
)

users <- data.frame(
  id = c(10, 20, 30),
  username = c('alice','bob','carol')
)

# orders.user_id matches users.id
left_join(orders, users, by = c('user_id' = 'id'))

Unir con varias claves

Puede unir por varias columnas pasando un vector a by. Todas las columnas especificadas deben coincidir para que se unan dos filas. Esto permite trabajar con claves compuestas cuando ninguna columna individual es única.

library(dplyr)

actual <- data.frame(
  year = c(2023, 2023, 2024, 2024),
  quarter = c('Q1','Q2','Q1','Q2'),
  sales = c(100, 120, 130, 150)
)

target <- data.frame(
  year = c(2023, 2023, 2024, 2024),
  quarter = c('Q1','Q2','Q1','Q2'),
  target = c(110, 115, 125, 145)
)

inner_join(actual, target, by = c('year', 'quarter'))

Encadenar varias uniones

Puede encadenar varias uniones en una sola canalización mediante el operador pipe. Construya una vista desnormalizada añadiendo información de varias tablas de consulta, un paso a la vez.

library(dplyr)

orders <- data.frame(order_id=1:3, cust_id=c(1,2,1), prod_id=c(10,10,20))
customers <- data.frame(cust_id=1:2, name=c('Alice','Bob'))
products <- data.frame(prod_id=c(10,20), product=c('Widget','Gadget'))

orders %>%
  left_join(customers, by = 'cust_id') %>%
  left_join(products, by = 'prod_id')

Gestionar columnas duplicadas

Cuando ambas tablas tienen columnas con el mismo nombre, aparte de la clave de unión, dplyr añade los sufijos .x y .y. Puede personalizarlos con el argumento suffix y después seleccionar o cambiar el nombre de las columnas según sea necesario.

library(dplyr)

current <- data.frame(id=1:3, value=c(10,20,30), date=Sys.Date())
historic <- data.frame(id=1:3, value=c(8,22,28), date=Sys.Date()-365)

# Both have 'value' and 'date' columns
result <- inner_join(current, historic, by='id',
                     suffix=c('_current','_historic'))
print(names(result))

Comprobación rápida

¿Qué unión de dplyr devuelve únicamente las filas de la tabla izquierda que no tienen una fila coincidente en la tabla derecha?

Repaso: uniones de dplyr

Ideas clave sobre las uniones de varias tablas en dplyr:

  • inner_join() — solo las filas coincidentes de ambas tablas
  • left_join() — todas las filas de la izquierda; NA cuando no hay coincidencia a la derecha
  • right_join() — todas las filas de la derecha; NA cuando no hay coincidencia a la izquierda
  • full_join() — todas las filas de ambas tablas; NA cuando no hay coincidencia
  • anti_join() — filas de x SIN coincidencia en y (herramienta de filtrado)
  • semi_join() — filas de x CON coincidencia en y (herramienta de filtrado)
  • Use by = c('x_col' = 'y_col') para nombres de columna diferentes
  • Use un vector para claves compuestas: by = c('year', 'quarter')
library(dplyr)

# Chain of joins: the typical real-world pattern
orders <- data.frame(oid=1:3, cid=c(1,2,1), pid=c(10,20,10))
customers <- data.frame(cid=1:2, name=c('Alice','Bob'))
products <- data.frame(pid=c(10,20), name=c('Widget','Gadget'), price=c(9.99,19.99))

orders %>%
  inner_join(customers, by='cid') %>%
  inner_join(products, by='pid', suffix=c('','_product')) %>%
  select(oid, name, name_product, price)

Preguntas frecuentes

¿La lección «Uniones entre varias tablas en dplyr» es gratis?

Sí — el texto completo de «Uniones entre varias tablas en dplyr» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Uniones entre varias tablas en dplyr»?

Domine inner_join, left_join, right_join, full_join y anti_join. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Uniones entre varias tablas en dplyr»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Resúmenes agrupados y group_by()
  2. Funciones de ventana: lag, lead y cumsum
  3. Uniones entre varias tablas en dplyr
  4. Evaluación ordenada: {{ }} y .data
← Volver a R Academy