Aprenda a função join de uma vez por todas!

Estava dando aula recentemente e um dos meus alunos ficou na dúvida para fazer a junção de dois datasets. A teoria ajuda a explicar, mas a prática é fundamental nestes casos. Decidi então compartilhar esse material, que imagino ser extremamente didático para poder explicar estas funções. Vou deixar os dois datasets que usei para que vocês possam fazer o download e aprender de uma vez por todas.

É difícil encontrarmos uma análise de dados que seja feita apenas com uma tabela. Na prática, você tem muitas delas e precisa combiná-las para responder às perguntas do negócio. Coletivamente, várias tabelas de dados são chamadas de dados relacionais, porque são as relações, não apenas os conjuntos de dados individuais, que são importantes.

Cumpre ressaltar aqui que relações são sempre feitas em par. Relações de três ou mais tabelas são sempre uma propriedade das relações de cada par. O pacote dplyr oferece várias funções de junção (xxx_join ()) que fornecem maneiras alternativas de juntar frames de dados:

  • inner_join()
  • left_join()
  • right_join()
  • full_join()

Para que o texto alcance seus objetivos didáticos, vamos utilizar dois datasets: titulos.csv e estado.csv

titulos.csv estado.csv

Vejam que nós temos a mesma variável “time” nos dois datasets. Essa será a variável usada para fazermos a conexão. Ela é uma chave! Nós precisamos de um elo, alguma coisa que ligue os dois bancos. Algo que seja comum entre os dois. Caso isso não exista, não conseguiremos fazer a junção. Note ainda que no dataset “títulos” existe a observação Vitória-BA que não consta no dataset “estado” e perceba também que no dataset “estado” nos temos a observação Botafogo que não consta no dataset “títulos”. Não me interprete mal, não foi minha intenção dizer que o Botafogo não possui títulos. Este é apenas um exemplo ;).

Bom, vamos ao que interessa!

Inner Join – esta função vai manter no dataset mesclado as observações que estão presentes nos dois datasets.

Explicando de outra forma: a tabela final conterá apenas as linhas que estiverem presentes nos dois datasets. No nosso exemplo, os times que não aparecem nas duas tabelas serão descartados. Logo Vitória-BA e Botafogo que estão em um deles e não nos dois, serão descartados.

Vou antes de apresentar a tabela, remover a variável “id” do dataset “títulos”, pois neste exemplo não é importante:

titulos <- select(titulos,  everything(), -id)

Agora sim o inner_join:

base_inner_join <- inner_join(titulos, estado, by = "time")

Explicando a linha acima, temos a criação de um novo dataset chamado “base_inner_join” onde utilizamos a função inner_join(), os dois datasets X = titulos e Y = estado, mesclados pela chave “time”. Lembre-se, precisamos desta chave para mesclar as duas tabelas. Veja o resultado:

Como mencionado não temos as observações Vitória-BA e Botafogo. Não a chaves para o relacionamento destes dois times.

Left join – de forma resumida, esta função mantém todas as observações em X. Logo, no nosso exemplo o dataset X = titulos permanecerá com todas as suas linhas, incluindo o Vitória-BA. Note que não temos Vitória-BA no dataset “estado”, entretanto o left_join mantém todas as observações de X. Neste caso o Botafogo ficará de fora, pois não temos correspondência no dataset “titulos”.

Note que o Vitória-BA apresenta um valor faltante na coluna estado. Se você observar o dataset “estado” vai confirmar que de fato não existe tal valor, entretanto a observação estava presente em X e, portanto, será preservada.

Right join – esta função, de forma resumida manterá todas as observações presentes em Y. Se no left join a observação Botafogo ficou de fora, permanecendo o Vitória-BA, o right_join fará o contrário. Manterá todas as observações de Y e fará a correspondência com X. Logo, Botafogo permanecerá e Vitória-BA ficará de fora:

base_right_join <- right_join(titulos, estado, by = "time")

O comportamento do inner_join, left_join e right_join é justamente retornar apenas as linhas em que as chaves coincidiram (efeito de filtro).

Bom, mas existem situações em seja necessário preservar todos os registros em ambos os conjuntos de dados, o que podemos fazer facilmente com o full_join. Nenhum dos conjuntos de dados perderá registros no resultado final, isto é, quando as chaves forem iguais, todos os campos estarão preenchidos. Quando não houver ocorrência das chaves em ambos os lados, será informado NA em qualquer um deles.

base_full_join <- full_join(titulos, estado, by = "time")

Não perdemos nenhum registro. Vitória-BA e Botafogo que eram  excludentes, estão presentes no resultado.

E aqui neste final você pode estar se perguntando. Qual eu devo usar?

Isso vai depender da sua necessidade. O importante é que você entenda e saiba usar as funções. Compreender como cada uma faz a junção das tabelas. Outro ponto importante é tratar os missing values. Nosso nosso exemplo em uma rápida pesquisa pela internet você descobre que:

Vitória-BA – estado: Bahia

base_full_join[which(base_full_join$time == "Vitória-BA"), 4] <- "Bahia"

Botafogo – brasileiro = 2

base_full_join[which(base_full_join$time == "Botafogo"), 2] <- 2

Botafogo – regional = 21

base_full_join[which(base_full_join$time == "Botafogo"), 3] <- 21

Segue então o final do nosso exercício:

Espero ter sido claro nesta explicação. Baixem os datasets e repitam os comandos! Vocês verão que é bem simples.

Base utilizada:

Dataset titulos.csv
Dataset estado.csv

Referências:

BOEHMKE, Bradley C.. Data Wrangling with R. Switzerland: Springer, 2016. (Use R!).

OLIVEIRA, Pauo Felipe de; GUERRA, Saulo; MCDONNELL, Robert. Ciência de dados com R: introdução. Brasília: Ibpad, 2018. 240 p.

WICKHAN, Hadley; GROLEMUND, Garrett. R para Data Science: importe, arrume, transforme, visualize e modele dados. Rio de Janeiro: Alta Books, 2019. Traduzido por Samantha Batista.

Sobre o autor

Rodrigo Zambon
Sólida experiência em Metodologias Ágeis e Engenharia de Software, com mais de 15 anos atuando como professor de Scrum e Kanban. No Governo do Estado do Espírito Santo, gerenciou uma variedade de projetos, tanto na área de TI, como em outros setores. Sou cientista de dados formado pela USP e atualmente estou profundamente envolvido na área de dados, desempenhando o papel de DPO (Data Protection Officer) no Governo.
0 respostas

Deixe uma resposta

Want to join the discussion?
Feel free to contribute!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *