Menu

Merge e Joins de Data Frames no R (merge, left_join)

Combinando data frames por uma chave compartilhada: merge() para inner, left, right e full joins, chaves com nomes diferentes via by.x/by.y, a família de joins do dplyr e rbind() para empilhar linhas.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Duas Tabelas, Uma Chave

Dados reais raramente vivem em uma única tabela. Os clientes ficam em um data frame, seus pedidos em outro, e a pergunta - "quanto cada cliente gastou?" - precisa dos dois. O que os conecta é uma chave: uma coluna presente em cada tabela que identifica a mesma entidade. Combinar tabelas por uma chave é um join (palavra do SQL) ou um merge (palavra do R base); mesma operação.

Aqui está o par de tabelas que o restante desta página usa. Repare que o cliente 5 fez um pedido mas não está na tabela de clientes, e os clientes 2 e 4 nunca pediram nada:

As incompatibilidades são propositais - o que um join faz com as linhas sem correspondência é exatamente o que distingue os tipos de join.

merge(): Inner Join por Padrão

merge(x, y, by = "key") casa linhas com chaves iguais e cola suas colunas. Por padrão ele mantém apenas as chaves presentes nas duas tabelas - um inner join:

Voltam três linhas. Ana aparece duas vezes - ela tem dois pedidos, e um join produz uma linha de saída por par correspondente. Ben e Dana sumiram (sem pedidos), assim como o pedido misterioso do cliente 5 (sem cliente). Um inner join descarta silenciosamente as linhas sem correspondência das duas tabelas - exatamente o certo quando você só se importa com pares completos, e um bug silencioso de perda de dados quando não.

Left, Right e Full Joins: all.x, all.y, all

Para manter as linhas sem correspondência, diga de qual tabela as linhas são sagradas. all.x = TRUE mantém todas as linhas da primeira tabela - o left join, o join mais usado na prática:

Agora Ben e Dana sobrevivem, com NA em amount - "este cliente existe; nenhum pedido correspondeu." Esses NAs são informativos, não lixo: is.na(result$amount) é exatamente a lista de clientes que nunca pediram (o doc de valores ausentes cobre como trabalhar com eles). As variantes restantes são a mesma ideia apontada para outro lado: all.y = TRUE mantém todas as linhas da segunda tabela (right join - o pedido do cliente desconhecido 5 sobreviveria com NA em name), e all = TRUE mantém tudo dos dois lados (full join).

Escolha perguntando: quais linhas eu não posso perder? Enriquecer uma tabela-mestre com dados de consulta - left join, tabela-mestre primeiro. Auditar nas duas direções - full join.

Chaves com Nomes Diferentes: by.x e by.y

Tabelas raramente concordam nos nomes - id em uma, customer_id na outra. Não renomeie; informe os dois nomes ao merge():

A saída mantém o nome da primeira tabela para a chave. Relacionado: se as duas tabelas compartilham nomes de colunas que não são chave (ambas têm uma date, digamos), o merge as sufixa como date.x e date.y - renomeie-as logo, elas ficam péssimas de ler.

Os Joins do dplyr

O dplyr dá a cada tipo de join seu próprio verbo, de modo que a intenção fica no nome da função em vez de em argumentos-flag (estático; o sandbox roda apenas R base):

library(dplyr)

left_join(customers, orders, by = "id")
inner_join(customers, orders, by = "id")
full_join(customers, orders, by = "id")
left_join(customers, orders, by = c("id" = "customer_id"))  # different names

Além da legibilidade, left_join() preserva a ordem das linhas da primeira tabela (merge() reordena pela chave) e avisa em alto e bom som sobre correspondências muitos-para-muitos - veja a introdução ao dplyr para a família de verbos.

O membro subestimado é o anti_join(): ele retorna as linhas da primeira tabela que não têm correspondência na segunda - nenhuma coluna adicionada, só as sobras:

anti_join(customers, orders, by = "id")   # customers who never ordered

Essa pergunta - "quais linhas ficaram sem correspondência?" - aparece o tempo todo na limpeza de dados (IDs sem par, registros órfãos, consultas que falharam), e anti_join() a responde em uma chamada onde o R base precisa de customers[!(customers$id %in% orders$id), ].

Empilhando Linhas: rbind()

Um join combina as colunas de duas tabelas. Quando, em vez disso, você tem dois lotes do mesmo tipo de linhas - os pedidos de janeiro e os de fevereiro - você os empilha com rbind():

O requisito é estrito: os dois data frames precisam ter os mesmos nomes de colunas (em qualquer ordem - rbind casa pelo nome). Uma coluna faltando ou sobrando é um erro, não um preenchimento com NA. Quando os lotes têm colunas divergentes, o bind_rows() do dplyr é mais tolerante - ele alinha pelo nome e preenche as lacunas com NA.

A Explosão de Chaves Duplicadas

O acidente clássico de join: chaves que você acreditava serem únicas, mas não são - nas duas tabelas. Cada correspondência se emparelha com cada correspondência, multiplicando as linhas:

Duas linhas juntadas com duas linhas rendem quatro - cada x pareado com cada y. Em dados reais, é assim que uma tabela de 10.000 linhas vira 3 milhões de linhas e um faturamento total dobrado. merge() faz isso em silêncio. A defesa é um hábito: antes de fazer o join, verifique a chave que você assume ser única - anyDuplicated(customers$id) deve ser 0 - e depois do join, confira nrow() contra o que você esperava.

O Que Você Leva

  • merge(x, y, by = "key") é um inner join - linhas sem correspondência desaparecem silenciosamente.
  • all.x = TRUE (left), all.y = TRUE (right), all = TRUE (full) mantêm as linhas sem correspondência, preenchendo com NA.
  • Chaves com nomes diferentes: by.x / by.y no base, by = c("a" = "b") no dplyr.
  • O dplyr nomeia cada join; anti_join() - as linhas que não corresponderam - é o subestimado.
  • rbind() empilha tabelas de mesmo formato; as colunas precisam casar pelo nome.
  • Chaves duplicadas multiplicam linhas em silêncio - verifique anyDuplicated() antes, nrow() depois.

A seguir: remodelando entre os formatos wide e long com pivot_longer() e pivot_wider().

Perguntas frequentes

Como faço merge de dois data frames no R?

Use merge(x, y, by = "key") com a coluna-chave compartilhada. Por padrão ele faz um inner join - só sobrevivem as linhas cuja chave aparece nos dois data frames. Adicione all.x = TRUE para um left join, all.y = TRUE para um right join ou all = TRUE para um full join.

Como faço um left join no R?

R base: merge(x, y, by = "key", all.x = TRUE) mantém todas as linhas de x e preenche as colunas de y com NA onde não há correspondência. dplyr: left_join(x, y, by = "key") - mesmo resultado, e ainda preserva a ordem original das linhas de x, o que merge() não faz.

Como faço merge quando as colunas-chave têm nomes diferentes?

Informe os dois nomes ao merge(): merge(x, y, by.x = "id", by.y = "customer_id"). No dplyr o equivalente é left_join(x, y, by = c("id" = "customer_id")), ou, com o helper moderno, by = join_by(id == customer_id).

Qual é a diferença entre merge e rbind no R?

Eles combinam em dimensões diferentes. merge() casa linhas de duas tabelas por uma chave e combina suas colunas - um join. rbind() empilha as linhas de uma tabela embaixo das de outra - as duas precisam ter os mesmos nomes de colunas. Arquivos mensais com colunas idênticas pedem rbind(); clientes-mais-pedidos pede merge().

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR