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 comNA.- Chaves com nomes diferentes:
by.x/by.yno 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().