5.1 Funções do tidyr

O dplyr está para o tidyr assim como tesoura/cola está para um alicate/martelo.

Enquanto o dplyr faz recortes na base (com filter()e select()) e adições simples (mutate(), summarise()), o tidyr mexe no formato da tabela (gather(), spread()) e faz modificações menos triviais.

5.1.1 gather

  • “Empilha” o banco de dados
d_cjsg %>% 
  filter(!is.na(id_decision)) %>% 
  select(id_decision:dt_registration) %>% 
  gather(key, value, -id_decision) %>% 
  arrange(id_decision)

5.1.2 spread

  • “Joga” uma variável nas colunas
  • É essencialmente a função inversa de gather
d_cjsg %>% 
  filter(!is.na(id_decision)) %>% 
  select(id_decision:dt_registration) %>% 
  gather(key, value, -id_decision) %>% 
  spread(key, value)

5.1.3 Unindo e separando colunas

  • unite junta duas ou mais colunas usando algum separador (_, por exemplo).
  • separate faz o inverso de unite, e uma coluna em várias usando um separador.
d_cjsg %>% 
  select(id_lawsuit, class_subject) %>% 
  separate(class_subject, c('classe', 'assunto'), sep = ' / ', 
           extra = 'merge', fill = 'right') %>% 
  count(assunto, sort = TRUE)

5.1.4 List columns: nest e unnest

nest e unnest são operações inversas e servem para tratar dados complecos, como o que temos em d_cposg

d_partes <- d_cposg %>% 
  select(id_lawsuit, parts) %>% 
  unnest(parts)

d_data <- d_cposg %>% 
  select(id_lawsuit, data) %>% 
  unnest(data)

5.1.5 Joins

Para juntar tabelas, usar inner_join, left_join, anti_join, etc. O melhor material disso está em http://r4ds.had.co.nz/relational-data.html.

Exemplo de inner join:

d_cjsg %>% 
  filter(dmy(dt_registration) == "2018-01-18", !is.na(id_decision)) %>% 
  select(id_decision, id_lawsuit) %>% 
  inner_join(d_cposg, "id_lawsuit") %>% 
  glimpse()
#> Observations: 170
#> Variables: 8
#> $ id_decision <chr> "11109089", "11109088", "11108246", "11108245", "1...
#> $ id_lawsuit  <chr> "0003779-93.2015.8.26.0597", "3001293-25.2013.8.26...
#> $ id          <chr> "00037799320158260597", "30012932520138260510", "0...
#> $ file        <chr> "data-raw/camaras/cposg/00037799320158260597.html"...
#> $ hidden      <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, F...
#> $ data        <list> [<# A tibble: 14 x 2,    data              value ...
#> $ parts       <list> [<# A tibble: 3 x 4,      id name                ...
#> $ decisions   <list> [<# A tibble: 1 x 2,   date       decision       ...

Exemplo de right join:

d_cjsg %>% 
  filter(dmy(dt_registration) == "2018-01-18", !is.na(id_decision)) %>% 
  select(id_decision, id_lawsuit) %>% 
  right_join(d_cposg, "id_lawsuit") %>% 
  glimpse()
#> Observations: 11,763
#> Variables: 8
#> $ id_decision <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
#> $ id_lawsuit  <chr> "0000003-71.2016.8.26.0073", "0000004-09.2017.8.26...
#> $ id          <chr> "00000037120168260073", "00000040920178260142", "0...
#> $ file        <chr> "data-raw/camaras/cposg/00000037120168260073.html"...
#> $ hidden      <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, F...
#> $ data        <list> [<# A tibble: 11 x 2,    data              value ...
#> $ parts       <list> [<# A tibble: 3 x 4,      id name                ...
#> $ decisions   <list> [<# A tibble: 1 x 2,   date       decision       ...

5.1.6 Duplicatas

Para retirar duplicatas, utilizar distinct. Ele considera apenas a primeira linha em que encontra um padrão para as combinações de variáveis escolhidas e descarta as demais.

d_cjsg %>% 
  distinct(district)

Para manter as demais colunas, use .keep_all =:

d_cjsg %>% 
  distinct(district, .keep_all = TRUE)

Use janitor::get_dupes() para averiguar os casos em que há repetição de combinações de colunas.

d_cjsg %>% 
  janitor::get_dupes(id_lawsuit)

Para mais aplicações do janitor, ver este blog post.