La función merge() en R: unir dos tablas
merge() junta dos tablas usando una columna que tienen en común. Es el equivalente al BUSCARV de Excel, pero sin arrastrar fórmulas y sin equivocarte de rango.
Ejemplo simple
Dos tablas que comparten la columna id:
clientes <- data.frame(
id = c(1, 2, 3),
nombre = c("Ana", "Luis", "Marta")
)
pedidos <- data.frame(
id = c(1, 2, 3),
importe = c(120, 45, 300)
)
merge(clientes, pedidos, by = "id")
Y ya tienes una sola tabla con nombre e importe. El argumento by indica la columna por la que cruzar.
Si las dos tablas comparten el nombre de esa columna, puedes incluso omitirlo: R la detecta sola. Pero es mejor ponerlo siempre → así el código dice explícitamente qué está haciendo.
Los cuatro tipos de unión
Aquí está lo que de verdad hay que entender. ¿Qué pasa si un cliente no tiene pedidos?
clientes <- data.frame(
id = c(1, 2, 3, 4),
nombre = c("Ana", "Luis", "Marta", "Iván")
)
pedidos <- data.frame(
id = c(1, 2, 3, 5),
importe = c(120, 45, 300, 80)
)
Iván (id 4) no tiene pedido, y hay un pedido del id 5 que no corresponde a ningún cliente. Según lo que quieras, cambias los argumentos:
# Solo los que están en ambas (por defecto)
merge(clientes, pedidos, by = "id")
# Todos los clientes, tengan pedido o no
merge(clientes, pedidos, by = "id", all.x = TRUE)
# Todos los pedidos, tengan cliente o no
merge(clientes, pedidos, by = "id", all.y = TRUE)
# Absolutamente todo
merge(clientes, pedidos, by = "id", all = TRUE)
Donde no hay correspondencia, R rellena con NA. Eso es precisamente lo útil: te enseña los huecos en vez de esconderlos.
Ejemplo algo más completo: columnas con nombres distintos
Lo habitual en el mundo real es que la columna clave se llame diferente en cada tabla:
clientes <- data.frame(
id_cliente = c(1, 2, 3),
nombre = c("Ana", "Luis", "Marta")
)
pedidos <- data.frame(
cliente = c(1, 2, 3),
importe = c(120, 45, 300)
)
merge(clientes, pedidos, by.x = "id_cliente", by.y = "cliente")
by.x es la columna de la primera tabla y by.y la de la segunda.
Un consejo que ahorra sustos: después de cualquier merge(), comprueba el número de filas. Y antes de unir, échale un ojo a las dos tablas con head() y str() para confirmar que la columna clave es del mismo tipo en ambas.
resultado <- merge(clientes, pedidos, by.x = "id_cliente", by.y = "cliente")
nrow(clientes)
nrow(resultado)
Si el resultado tiene más filas que la tabla original, es que la clave estaba duplicada en alguna de las dos y se han cruzado combinaciones de más. Es el error más típico al unir tablas, y pasa desapercibido si no lo miras.