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)
tibble(nome=c("A", "B", "C"),
data1 <-value=c(10, 20, 30))
tibble(nome=c("A", "D", "C"),
data2 <-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.
data2 %>%
data3 <- # 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.
data2 %>%
data3 <- # 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
get_candidates(year=2018, position="President") %>%
candidatos <- as_tibble()
## Error in get_candidates(year = 2018, position = "President"): could not find function "get_candidates"
# Banco Votos
get_votes(year = 2018, position="President", state="RJ") %>%
votos <- 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!