Tutorial 7: Intro ao Tidyverse II: Joins

Introdução: Conectando Bancos de Dados com Dplyr.

Raramente, você encontrará um banco de dados onde todas as informações da sua pesquisa estão contidas e prontas para serem analisadas.

Na maioria dos casos, e por boas razões, bancos de dados possuem informações distintas e complementares, e os pesquisadores precisam conectá-los com vistas a construir o material necessário para suas análises.

Este tipo de dados conectados a partir de várias tabelas são chamados de dados relacionais. Dados eleitorais no Brasil providos pelo TSE, por exemplo, vem com pedaços distintos de informação, que podem, a depender dos objetivos de sua análise, ser conectados. De forma mais concreta, estes são alguns exemplos de bancos disponíveis no TSE:

  • Candidatos: arrecadação, nome, profissão, etc.

  • Votação: dados de votação por município, zonal, seção eleitoral.

  • Eleitorado: perfil dos eleitores registrados no nível da zona eleitoral.

Chaves (keys)

Ainda nos casos dos bancos de dados do TSE, por exemplo, usando o número do candidato e a unidade eleitoral é possível conectar os bancos de candidatos e votação, ou usando o número da zona eleitoral por município, conectar votação e eleitorado. A partir dessa conexão, nossas análises ficam mais completes e interessantes.

Estas variáveis capazes de conectar bancos de dados são chamadas chaves. Estas chaves devem ser:

  • Completas. Nunca tenha missing values nas suas chaves.

  • Únicas: cada observação deve possuir uma chave distinta. Evite sempre duplicações.

Joins

Inspirado na linguaguem SQL, o dplyr possui um conjunto de funções com foco em conectar bancos de dados distintos.

Vamos criar dois bancos bem simples para entendermos como estes joins funcionam.

library(tidyverse)
data1 <- tibble(nome=c("A", "B", "C"), 
                value=c(10, 20, 30)) 
data2 <- tibble(nome=c("A", "D", "C"), 
                value2=c(10, 50, 30))

left_join()

left_join(data1, data2)
## # A tibble: 3 x 3
##   nome  value value2
##   <chr> <dbl>  <dbl>
## 1 A        10     10
## 2 B        20     NA
## 3 C        30     30

inner_join()

inner_join(data1, data2)
## # A tibble: 2 x 3
##   nome  value value2
##   <chr> <dbl>  <dbl>
## 1 A        10     10
## 2 C        30     30

full_join()

full_join(data1, data2)
## # A tibble: 4 x 3
##   nome  value value2
##   <chr> <dbl>  <dbl>
## 1 A        10     10
## 2 B        20     NA
## 3 C        30     30
## 4 D        NA     50

Chaves Distintas?

Em inúmeros casos, os bancos que precisamos conectar terá nomes diferentes. Este problema é fácil de resolver. É preciso adicionar o argumento dos nomes, e ajudar as funções joins a fazerem seu serviço.

data3 <- data2 %>%
          # alterando o nome
          select(chave=nome, everything())

# Join

left_join(data1, data3, 
          by=c("nome"="chave")) # adicione argumento by.
## # A tibble: 3 x 3
##   nome  value value2
##   <chr> <dbl>  <dbl>
## 1 A        10     10
## 2 B        20     NA
## 3 C        30     30

Múltiplas Chaves

A lógica para múltiplas chaves é semelhante: precisamos específicar seus nomes na função by.

data3 <- data2 %>%
          # alterando o nome
          select(nome, value=value2)

left_join(data1, data3, by=c("nome", "value"))
## # A tibble: 3 x 2
##   nome  value
##   <chr> <dbl>
## 1 A        10
## 2 B        20
## 3 C        30

Desafio

Abra os bancos de dados de candidatos e votos do TSE. Faça um join entre eles, e salve o banco de dados.

  • Quantas linhas este novo banco de dados possuí?

  • Explique o número de linhas.

# Banco Candidatos
candidatos <- get_candidates(year=2018, position="President") %>% 
                as_tibble()
## Error in get_candidates(year = 2018, position = "President"): could not find function "get_candidates"
# Banco Votos
votos <- get_votes(year = 2018, position="President", state="RJ") %>%
            as_tibble()
## Error in get_votes(year = 2018, position = "President", state = "RJ"): could not find function "get_votes"
# Join? 

Concatenando Bancos de Dados

Além de juntar bancos de dados usando chaves, podemos concatecar bancos verticalmente (pelas linhas) ou horizontalmente (pelas colunas).

bind_rows: por linhas

bind_rows(data1, data2)
## # A tibble: 6 x 3
##   nome  value value2
##   <chr> <dbl>  <dbl>
## 1 A        10     NA
## 2 B        20     NA
## 3 C        30     NA
## 4 A        NA     10
## 5 D        NA     50
## 6 C        NA     30

Note: ao conectar por linha, as colunas precisam ter os mesmos nomes. Caso não, você adicionará uma nova variável ao resultado final.

bind_cols: por colunas

bind_cols(data1, data2)
## # A tibble: 3 x 4
##   nome...1 value nome...3 value2
##   <chr>    <dbl> <chr>     <dbl>
## 1 A           10 A            10
## 2 B           20 D            50
## 3 C           30 C            30

Note: ao conectar por coluna, as linhas precisam ter tamanho igual.

Exercícios!

No site do curso, estão disponíveis os exercícios da semana. Vamos praticar!