class: center, middle, inverse, title-slide # Introdução a Métodos Computacionais para Ciência Sociais ## Intro ao Tidyverse: Joins ### Tiago Ventura ### CPDOC-FGV --- ## Semana Passada 1. Introdução ao Tidyverse 2. Dplyr ## Esta Semana 1. Joins (Ainda no dplyr) 2. Dados Tidy (tidyr) --- # 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 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**. E são chamados de **dados relacionais**. --- # Exemplo TSE: Dados eleitorais no Brasil providos pelo TSE, por exemplo, vem com tabelas distintas de informação: - **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. A lógica é de que cada tabela se refere a informações em **unidades distintas.** --- ## Chaves (keys) São as variáveis capazes de conectar bancos de dados. Estas **chaves** são, ou devem ser: - Completas. Nunca tenha missing values nas suas chaves. - Únicas: cada observação deve possuir uma chave distinta. Evite sempre duplicações. --- class: middle, center, inverse ## 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. ```r data1 <- tibble(nome=c("A", "B", "C"), value=c(10, 20, 30)) data2 <- tibble(nome=c("A", "D", "C"), value2=c(10, 50, 30)) data1 ``` ``` ## # A tibble: 3 x 2 ## nome value ## <chr> <dbl> ## 1 A 10 ## 2 B 20 ## 3 C 30 ``` ```r data2 ``` ``` ## # A tibble: 3 x 2 ## nome value2 ## <chr> <dbl> ## 1 A 10 ## 2 D 50 ## 3 C 30 ``` --- ### left_join() .pull-left[ <img src="figs/left-join.gif" width="80%" /> ] .pull-right[ ```r 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() .pull-left[ <img src="figs/inner-join.gif" width="80%" /> ] .pull-right[ ```r 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() .pull-left[ <img src="figs/full-join.gif" width="80%" /> ] .pull-right[ ```r 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? ```r 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 ```r colnames(data2) ``` ``` ## [1] "nome" "value2" ``` ```r colnames(data3) ``` ``` ## [1] "chave" "value2" ``` ```r left_join(data2, data3, by=c("nome"="chave", "value2")) # adicione argumento by e separe , ``` ``` ## # A tibble: 3 x 2 ## nome value2 ## <chr> <dbl> ## 1 A 10 ## 2 D 50 ## 3 C 30 ``` --- ### Desafio Abra os bancos de dados de candidatos e votos para deputado federal Estado do Rio de Janeiro. Faça um join entre eles, e salve o banco de dados. Responda: - Considerando a profissão dos deputados (disponível no banco de candidatos), quais asprofissões que receberam mais votos no Estado do Rio de Janeiro ? ```r library(cepespR) library(tidyverse) # Banco Candidatos Brasil inteiro candidatos <- get_candidates(year=2018, position="Federal Deputy") %>% as_tibble() # Banco Votos votos <- get_votes(year = 2018, position="Federal Deputy", state="RJ") %>% as_tibble() ``` --- ## 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 ```r 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 ```r 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**.