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 umtibble
. - 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:
- selecione as colunas que acabam com “ion” ou que contêm “sum”.
- 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:
- filtre todas as decisões de 2018.
- filtre apenas casos em que
id_decision
não éNA
- A aplicação de
filter
modifica o objetod_cjsg
?
4.6.5 mutate
- Aceita várias novas colunas iterativamente.
- Novas variáveis devem ter o mesmo
length
que onrow
do bd original ou1
.
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
- Crie uma coluna
comarca_limpa
com a comarca sem acentos e maiúscula - Crie uma coluna binária
drogas
que valeTRUE
se no texto da decisão algo é falado de drogas eFALSE
caso contrário. Considere tanto a palavradroga
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
- 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 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)
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