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 deunite
, 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.