4.6 Pacotes dplyr e tidyr

Vamos trabalhar com d_cjsg!

4.6.1 Características do dplyr

  • O input é sempre uma tibble, e o output é sempre um tibble.
  • No primeiro argumento colocamos o tibble, e nos outros argumentos colocamo o que queremos fazer.
  • A utilização é facilitada com o emprego do operador %>%

4.6.2 As cinco funções principais

  • filter
  • mutate
  • select
  • arrange
  • summarise

4.6.3 select

  • Utilizar starts_with(x), contains(x), matches(x), one_of(x), etc.
  • Possível colocar nomes, índices, e intervalos de variáveis com :.
d_cjsg %>% 
  select(id_lawsuit, id_decision, district, rapporteur)
d_cjsg %>% 
  select(id_decision:district, class_subject)
d_cjsg %>% 
  select(id_lawsuit, starts_with('dt_'))

Exercícios:

  1. selecione as colunas que acabam com “ion” ou que contêm “sum”.
  2. tire as colunas de texto.

4.6.4 filter

  • Use | para “ou”.
  • Condições separadas por vírgulas é o mesmo que separar por &.
d_cjsg %>% 
  select(id_lawsuit, id_decision, district, rapporteur) %>% 
  filter(district == 'São Paulo')

Dica: usar %in%

d_cjsg %>% 
  select(id_lawsuit, id_decision, district, dt_decision, rapporteur) %>% 
  filter(district %in% c('Campinas', 'Sorocaba') &
         (day(dmy(dt_decision)) >= 29 | day(dmy(dt_decision)) < 25))
d_cjsg %>% 
  select(rapporteur) %>% 
  filter(str_detect(rapporteur, '[zZ]')) %>% 
  count(rapporteur, sort = TRUE)

Exercícios:

  1. filtre todas as decisões de 2018.
  2. filtre apenas casos em que id_decision não é NA
  3. A aplicação de filter modifica o objeto d_cjsg?

4.6.5 mutate

  • Aceita várias novas colunas iterativamente.
  • Novas variáveis devem ter o mesmo length que o nrow do bd original ou 1.
d_cjsg %>% 
  select(id_lawsuit, dt_decision) %>% 
  mutate(ano_julgamento = year(dmy(dt_decision)),
         ano_proc = str_sub(id_lawsuit, 12, 15),
         ano_proc = as.numeric(ano_proc),
         tempo_anos = ano_julgamento - ano_proc)

Exercícios

  1. Crie uma coluna comarca_limpa com a comarca sem acentos e maiúscula
  2. Crie uma coluna binária drogas que vale TRUE se no texto da decisão algo é falado de drogas e FALSE caso contrário. Considere tanto a palavra droga como seus sinônimos, algum exemplo de droga e a Lei de Drogas.

4.6.6 arrange

  • Simplesmente ordena de acordo com as opções.
  • Utilizar desc para ordem decrescente.
d_cjsg %>% 
  select(id_lawsuit, dt_decision) %>% 
  mutate(ano_julgamento = year(dmy(dt_decision)),
         ano_proc = str_sub(id_lawsuit, 12, 15),
         ano_proc = as.numeric(ano_proc)) %>% 
  mutate(tempo_anos = ano_julgamento - ano_proc) %>% 
  arrange(desc(tempo_anos))

4.6.7 summarise

  • Retorna um vetor de tamanho 1 a partir de uma conta com as variáveis.
  • Geralmente é utilizado em conjunto com group_by.
  • Algumas funções importantes: n(), n_distinct().
d_cjsg %>% 
  select(id_lawsuit, district, dt_decision, court) %>% 
  mutate(ano_julgamento = year(dmy(dt_decision)),
         ano_proc = str_sub(id_lawsuit, 12, 15),
         ano_proc = as.numeric(ano_proc)) %>% 
  mutate(tempo_anos = ano_julgamento - ano_proc) %>% 
  arrange(desc(tempo_anos)) %>% 
  group_by(district, court) %>% 
  summarise(n = n(),
            media_anos = mean(tempo_anos),
            min_anos = min(tempo_anos),
            max_anos = max(tempo_anos)) %>% 
  filter(n > 5) %>% 
  arrange(desc(media_anos))
#> # A tibble: 406 x 6
#> # Groups:   district [60]
#>    district              court              n media_anos min_anos max_anos
#>    <chr>                 <chr>          <int>      <dbl>    <dbl>    <dbl>
#>  1 Osasco                16ª Câmara de…     6       5.67     0       20.0 
#>  2 Tatuí                 15ª Câmara de…     8       4.62     0       12.0 
#>  3 São Bernardo do Campo 3ª Câmara de …     8       4.38     0       28.0 
#>  4 Botucatu              16ª Câmara de…    10       4.10     0       15.0 
#>  5 Mogi das Cruzes       9ª Câmara de …     7       3.71     0        7.00
#>  6 Tatuí                 2ª Câmara de …     6       3.67     0       10.0 
#>  7 Avaré                 13ª Câmara de…     8       3.62     0       11.0 
#>  8 Guarujá               5ª Câmara de …     6       3.50     0       10.0 
#>  9 Praia Grande          2ª Câmara de …     6       3.33     1.00     7.00
#> 10 Mogi das Cruzes       4ª Câmara de …     6       3.00     0        7.00
#> # ... with 396 more rows

A função count() simplifica um group_by %>% summarise %>% ungroup e é bem útil:

d_cjsg %>% 
  count(rapporteur, sort = TRUE) %>% 
  mutate(prop = n / sum(n), prop = scales::percent(prop))

Exercício

  1. Quem é o relator mais prolixo?

4.6.8 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)

4.6.9 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)

4.6.10 Funções auxiliares

  • 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)

4.6.11 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_cposg <- read_rds(glue("{path}/d_cposg.rds"))

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

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

4.6.12 Um pouco mais de transformação de dados

  • Para juntar tabelas, usar inner_join, left_join, anti_join, etc.
  • Para realizar operações mais gerais, usar do.
  • Para retirar duplicatas, utilizar distinct.
  • Para fazer algumas mágicas, trabalhar com