Até aqui, cobrimos as seguintes áreas do processo de manipulação de dados:
Básico do dplyr.
Dados tidy.
Visualização.
Hoje vamos fazer uma aula extra com alguns funcionalidades mais avançadas. São elas:
Verbos Complementares no Dplyr.
Manipulação de Strings (stringr
).
Expressões Regulares.
Verbos complementares são o dplyr
com esteroídes.
summarise_at
, mutate_at
,filter_at
,
select_if
, mutate_if
, filter_if
.
rename_all
, mutate_all
, summarise_all
.
Vamos mostrar alguns exemplos com nossos dados eleitorais:
library(cepespR)library(tidyverse)d <- get_votes(year = 2018, position = "Federal Deputy", regional_aggregation = "Municipio", state="RJ") %>% as_tibble()cand <- get_candidates(year=2018, position="Federal Deputy") %>% as_tibble()
function_if
: function_if(critério_lógico, função alterando)
Um condições lógica (is.numeric, is.character, is.na)
função alterando quando a condições lógica for TRUE.
d %>% select_if(is.numeric)
## # A tibble: 51,768 x 10## ANO_ELEICAO NUM_TURNO CODIGO_CARGO NUMERO_CANDIDATO CODIGO_MACRO CODIGO_MESO CODIGO_MICRO## <int> <int> <int> <int> <int> <int> <int>## 1 2018 1 6 10 3 5 13## 2 2018 1 6 1000 3 5 13## 3 2018 1 6 1001 3 5 13## 4 2018 1 6 1002 3 5 13## 5 2018 1 6 1003 3 5 13## 6 2018 1 6 1004 3 5 13## 7 2018 1 6 1005 3 5 13## 8 2018 1 6 1007 3 5 13## 9 2018 1 6 1009 3 5 13## 10 2018 1 6 1010 3 5 13## # … with 51,758 more rows, and 3 more variables: COD_MUN_TSE <int>, COD_MUN_IBGE <int>,## # QTDE_VOTOS <int>
Altera e salva novas variáveis de acordo com uma condição.
d %>% mutate_if(is.character, str_to_title)
## # A tibble: 51,768 x 19## ANO_ELEICAO SIGLA_UE NUM_TURNO DESCRICAO_ELEIC… CODIGO_CARGO DESCRICAO_CARGO## <int> <chr> <int> <chr> <int> <chr> ## 1 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 2 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 3 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 4 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 5 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 6 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 7 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 8 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 9 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## 10 2018 Rj 1 Eleições Gerais… 6 Deputado Feder…## # … with 51,758 more rows, and 13 more variables: NUMERO_CANDIDATO <int>, CODIGO_MACRO <int>,## # NOME_MACRO <chr>, UF <chr>, NOME_UF <chr>, CODIGO_MESO <int>, NOME_MESO <chr>,## # CODIGO_MICRO <int>, NOME_MICRO <chr>, COD_MUN_TSE <int>, COD_MUN_IBGE <int>,## # NOME_MUNICIPIO <chr>, QTDE_VOTOS <int>
d %>% # dica para se quiser alterar o nome ao mesmo tempo. mutate_if(is.character, list(to_title= ~ str_to_title(.x)))
## # A tibble: 51,768 x 28## ANO_ELEICAO SIGLA_UE NUM_TURNO DESCRICAO_ELEIC… CODIGO_CARGO DESCRICAO_CARGO## <int> <chr> <int> <chr> <int> <chr> ## 1 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 2 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 3 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 4 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 5 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 6 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 7 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 8 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 9 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## 10 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER…## # … with 51,758 more rows, and 22 more variables: NUMERO_CANDIDATO <int>, CODIGO_MACRO <int>,## # NOME_MACRO <chr>, UF <chr>, NOME_UF <chr>, CODIGO_MESO <int>, NOME_MESO <chr>,## # CODIGO_MICRO <int>, NOME_MICRO <chr>, COD_MUN_TSE <int>, COD_MUN_IBGE <int>,## # NOME_MUNICIPIO <chr>, QTDE_VOTOS <int>, SIGLA_UE_to_title <chr>,## # DESCRICAO_ELEICAO_to_title <chr>, DESCRICAO_CARGO_to_title <chr>,## # NOME_MACRO_to_title <chr>, UF_to_title <chr>, NOME_UF_to_title <chr>,## # NOME_MESO_to_title <chr>, NOME_MICRO_to_title <chr>, NOME_MUNICIPIO_to_title <chr>
# pouco sentido nesse contexto, mas somente para mostrar como funciona. d %>% summarise_if(is.numeric, max)
## # A tibble: 1 x 10## ANO_ELEICAO NUM_TURNO CODIGO_CARGO NUMERO_CANDIDATO CODIGO_MACRO CODIGO_MESO CODIGO_MICRO## <int> <int> <int> <int> <int> <int> <int>## 1 2018 1 6 9099 3 6 18## # … with 3 more variables: COD_MUN_TSE <int>, COD_MUN_IBGE <int>, QTDE_VOTOS <int>
function_at
verb_at(vars(variaveis), fun(alterações))
Variáveis (onde é permitido usar as funções de ajuda do select)
O que você pretende alterar nestas variáveis.
# Converter Descricao para Minusculocand %>% mutate_at(vars(contains("DESCRICAO")), str_to_lower) %>% select(contains("DESCRICAO"))
## # A tibble: 8,588 x 8## DESCRICAO_ELEIC… DESCRICAO_UE DESCRICAO_CARGO DESCRICAO_OCUPA… DESCRICAO_SEXO## <chr> <chr> <chr> <chr> <chr> ## 1 eleições gerais… acre deputado feder… vereador masculino ## 2 eleições gerais… acre deputado feder… empresário masculino ## 3 eleições gerais… acre deputado feder… empresário masculino ## 4 eleições gerais… acre deputado feder… empresário masculino ## 5 eleições gerais… acre deputado feder… outros masculino ## 6 eleições gerais… acre deputado feder… outros feminino ## 7 eleições gerais… acre deputado feder… servidor públic… masculino ## 8 eleições gerais… acre deputado feder… professor de en… masculino ## 9 eleições gerais… acre deputado feder… servidor públic… masculino ## 10 eleições gerais… acre deputado feder… policial militar masculino ## # … with 8,578 more rows, and 3 more variables: DESCRICAO_GRAU_INSTRUCAO <chr>,## # DESCRICAO_ESTADO_CIVIL <chr>, DESCRICAO_NACIONALIDADE <chr>
cand %>% rename_at(vars(ends_with("CARGO")), ~ str_replace(.x, "CARGO", "Cargo")) %>% select(contains("Cargo"))
## # A tibble: 8,588 x 2## CODIGO_Cargo DESCRICAO_Cargo ## <int> <chr> ## 1 6 DEPUTADO FEDERAL## 2 6 DEPUTADO FEDERAL## 3 6 DEPUTADO FEDERAL## 4 6 DEPUTADO FEDERAL## 5 6 DEPUTADO FEDERAL## 6 6 DEPUTADO FEDERAL## 7 6 DEPUTADO FEDERAL## 8 6 DEPUTADO FEDERAL## 9 6 DEPUTADO FEDERAL## 10 6 DEPUTADO FEDERAL## # … with 8,578 more rows
~
Tildas, cobrinhas, ou ~
são atalhos para funções em R. Ao invés de você escrever uma função completa, ou uma função anônima, você usa a ~ e o .x como atalhos.
Alguns exemplos:
~
Tildas, cobrinhas, ou ~
são atalhos para funções em R. Ao invés de você escrever uma função completa, ou uma função anônima, você usa a ~ e o .x como atalhos.
Alguns exemplos:
map(list(a=sample(100, 10), b=sample(100, 10), c=sample(100, 10)), function(x) mean(x))
## $a## [1] 42.8## ## $b## [1] 41.6## ## $c## [1] 46
map(list(a=sample(100, 10), b=sample(100, 10), c=sample(100, 10)), ~ mean(.x))
## $a## [1] 43.4## ## $b## [1] 47## ## $c## [1] 52.7
~
Tildas, cobrinhas, ou ~
são atalhos para funções em R. Ao invés de você escrever uma função completa, ou uma função anônima, você usa a ~ e o .x como atalhos.
Alguns exemplos:
map(list(a=sample(100, 10), b=sample(100, 10), c=sample(100, 10)), function(x) mean(x))
## $a## [1] 42.8## ## $b## [1] 41.6## ## $c## [1] 46
map(list(a=sample(100, 10), b=sample(100, 10), c=sample(100, 10)), ~ mean(.x))
## $a## [1] 43.4## ## $b## [1] 47## ## $c## [1] 52.7
Este é o básico de programação funcional, que aprenderemos mais na frente.
cand %>% rename_at(vars(ends_with("CARGO")), ~ str_replace(.x, "CARGO", "Cargo")) %>% select(contains("Cargo"))
## # A tibble: 8,588 x 2## CODIGO_Cargo DESCRICAO_Cargo ## <int> <chr> ## 1 6 DEPUTADO FEDERAL## 2 6 DEPUTADO FEDERAL## 3 6 DEPUTADO FEDERAL## 4 6 DEPUTADO FEDERAL## 5 6 DEPUTADO FEDERAL## 6 6 DEPUTADO FEDERAL## 7 6 DEPUTADO FEDERAL## 8 6 DEPUTADO FEDERAL## 9 6 DEPUTADO FEDERAL## 10 6 DEPUTADO FEDERAL## # … with 8,578 more rows
cand %>% rename_at(vars(ends_with("CARGO")), function(x) str_replace(x, "CARGO", "Cargo")) %>% select(contains("Cargo"))
## # A tibble: 8,588 x 2## CODIGO_Cargo DESCRICAO_Cargo ## <int> <chr> ## 1 6 DEPUTADO FEDERAL## 2 6 DEPUTADO FEDERAL## 3 6 DEPUTADO FEDERAL## 4 6 DEPUTADO FEDERAL## 5 6 DEPUTADO FEDERAL## 6 6 DEPUTADO FEDERAL## 7 6 DEPUTADO FEDERAL## 8 6 DEPUTADO FEDERAL## 9 6 DEPUTADO FEDERAL## 10 6 DEPUTADO FEDERAL## # … with 8,578 more rows
function_all
function_all(var=all_by_default, função)
cand %>% mutate_all(str_trim) # retira espaços extras.
## # A tibble: 8,588 x 42## DATA_GERACAO HORA_GERACAO ANO_ELEICAO NUM_TURNO DESCRICAO_ELEIC… SIGLA_UF SIGLA_UE## <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 2 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 3 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 4 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 5 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 6 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 7 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 8 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 9 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 10 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## # … with 8,578 more rows, and 35 more variables: DESCRICAO_UE <chr>, CODIGO_CARGO <chr>,## # DESCRICAO_CARGO <chr>, NOME_CANDIDATO <chr>, NUMERO_CANDIDATO <chr>, CPF_CANDIDATO <chr>,## # NOME_URNA_CANDIDATO <chr>, COD_SITUACAO_CANDIDATURA <chr>,## # DES_SITUACAO_CANDIDATURA <chr>, NUMERO_PARTIDO <chr>, SIGLA_PARTIDO <chr>,## # NOME_PARTIDO <chr>, CODIGO_LEGENDA <chr>, SIGLA_LEGENDA <chr>, COMPOSICAO_LEGENDA <chr>,## # NOME_COLIGACAO <chr>, CODIGO_OCUPACAO <chr>, DESCRICAO_OCUPACAO <chr>,## # DATA_NASCIMENTO <chr>, NUM_TITULO_ELEITORAL_CANDIDATO <chr>, IDADE_DATA_ELEICAO <chr>,## # CODIGO_SEXO <chr>, DESCRICAO_SEXO <chr>, COD_GRAU_INSTRUCAO <chr>,## # DESCRICAO_GRAU_INSTRUCAO <chr>, CODIGO_ESTADO_CIVIL <chr>, DESCRICAO_ESTADO_CIVIL <chr>,## # CODIGO_NACIONALIDADE <chr>, DESCRICAO_NACIONALIDADE <chr>, SIGLA_UF_NASCIMENTO <chr>,## # CODIGO_MUNICIPIO_NASCIMENTO <chr>, NOME_MUNICIPIO_NASCIMENTO <chr>,## # DESPESA_MAX_CAMPANHA <chr>, COD_SIT_TOT_TURNO <chr>, DESC_SIT_TOT_TURNO <chr>
Exemplo com o banco mtcars
mtcars %>% summarise_all(mean)
## mpg cyl disp hp drat wt qsec vs am gear carb## 1 20.09062 6.1875 230.7219 146.6875 3.596563 3.21725 17.84875 0.4375 0.40625 3.6875 2.8125
~
cand %>% rename_all(~ str_replace_all(.x, "_", "x"))
## # A tibble: 8,588 x 42## DATAxGERACAO HORAxGERACAO ANOxELEICAO NUMxTURNO DESCRICAOxELEIC… SIGLAxUF SIGLAxUE## <chr> <chr> <int> <int> <chr> <chr> <chr> ## 1 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 2 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 3 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 4 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 5 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 6 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 7 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 8 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 9 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 10 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## # … with 8,578 more rows, and 35 more variables: DESCRICAOxUE <chr>, CODIGOxCARGO <int>,## # DESCRICAOxCARGO <chr>, NOMExCANDIDATO <chr>, NUMEROxCANDIDATO <int>, CPFxCANDIDATO <chr>,## # NOMExURNAxCANDIDATO <chr>, CODxSITUACAOxCANDIDATURA <int>,## # DESxSITUACAOxCANDIDATURA <chr>, NUMEROxPARTIDO <int>, SIGLAxPARTIDO <chr>,## # NOMExPARTIDO <chr>, CODIGOxLEGENDA <int64>, SIGLAxLEGENDA <chr>,## # COMPOSICAOxLEGENDA <chr>, NOMExCOLIGACAO <chr>, CODIGOxOCUPACAO <int>,## # DESCRICAOxOCUPACAO <chr>, DATAxNASCIMENTO <chr>, NUMxTITULOxELEITORALxCANDIDATO <chr>,## # IDADExDATAxELEICAO <int>, CODIGOxSEXO <int>, DESCRICAOxSEXO <chr>,## # CODxGRAUxINSTRUCAO <int>, DESCRICAOxGRAUxINSTRUCAO <chr>, CODIGOxESTADOxCIVIL <int>,## # DESCRICAOxESTADOxCIVIL <chr>, CODIGOxNACIONALIDADE <int>, DESCRICAOxNACIONALIDADE <chr>,## # SIGLAxUFxNASCIMENTO <chr>, CODIGOxMUNICIPIOxNASCIMENTO <int>,## # NOMExMUNICIPIOxNASCIMENTO <chr>, DESPESAxMAXxCAMPANHA <int>, CODxSITxTOTxTURNO <int>,## # DESCxSITxTOTxTURNO <chr>
Strings = variável de texto.
Estas técnicas de manipulação de strings são fundamentais quando fazemos raspagem de texto, usamos dados de redes sociais, e até preparamos visualizações de dados.
Para aprendermos a manipular strings, vamos:
Usar o pacote do tidyverse stringr
Aprender o básico de expressões regulares.
O stringr
, como todo o tidyverse, faz o que seu nome indica. Estas funções, em geral, possuem dois componentes. Todas as suas funções iniciam com str
. Veja a lista completa de funções aqui
Vejamos alguns exemplos.
Dois Componentes:
Primeiro argumento: input
Segundo argumento: padrão para detectar
Dois Componentes:
Primeiro argumento: input
Segundo argumento: padrão para detectar
str_detect()
str_detect(c("Tiago", "Ventura"), "Ventura")
## [1] FALSE TRUE
Dois Componentes:
Primeiro argumento: input
Segundo argumento: padrão para detectar
str_detect()
str_detect(c("Tiago", "Ventura"), "Ventura")
## [1] FALSE TRUE
str_count()
str_count(c("Tiago", "Ventura"), "Ventura")
## [1] 0 1
Dois Componentes:
Primeiro argumento: input
Segundo argumento: padrão para detectar
str_detect()
str_detect(c("Tiago", "Ventura"), "Ventura")
## [1] FALSE TRUE
str_count()
str_count(c("Tiago", "Ventura"), "Ventura")
## [1] 0 1
str_locate()
str_locate(c("Tiago#umd", "Ventura#fgv"), "#")
## start end## [1,] 6 6## [2,] 8 8
Dois Componentes:
Primeiro argumento: input
Segundo argumento: padrão para detectar
str_detect()
str_detect(c("Tiago", "Ventura"), "Ventura")
## [1] FALSE TRUE
str_count()
str_count(c("Tiago", "Ventura"), "Ventura")
## [1] 0 1
str_locate()
str_locate(c("Tiago#umd", "Ventura#fgv"), "#")
## start end## [1,] 6 6## [2,] 8 8
str_replace_all()
str_replace_all(c("Tiago#umd", "Ventura#fgv"), "#", " ")
## [1] "Tiago umd" "Ventura fgv"
str_to_lower()
str_to_lower(c("Tiago#umd", "Ventura#fgv"))
## [1] "tiago#umd" "ventura#fgv"
cand %>% select(NOME_URNA_CANDIDATO) %>% mutate(nome_minusculo=str_to_lower(NOME_URNA_CANDIDATO))
## # A tibble: 8,588 x 2## NOME_URNA_CANDIDATO nome_minusculo ## <chr> <chr> ## 1 "PASTOR MANUEL MARCOS" "pastor manuel marcos"## 2 "JUNIOR PARIS DAKAR" "junior paris dakar" ## 3 "RUDILEI ESTRELA" "rudilei estrela" ## 4 "NELSON SALES" "nelson sales" ## 5 "EURICO CORDEIRO " "eurico cordeiro " ## 6 "DJÊ CAVALCANTE" "djê cavalcante" ## 7 "PAULO SORIANO" "paulo soriano" ## 8 "JESUS SÉRGIO" "jesus sérgio" ## 9 "CHICO DOIDO DA SAÚDE" "chico doido da saúde"## 10 "CABRAL" "cabral" ## # … with 8,578 more rows
Dois Componentes:
Primeiro argumento: input
Segundo argumento: padrão para extrair-dividir.
nomes<-cand$NOME_URNA_CANDIDATO[1:10]
str_sub()
: Extrai por posição.
str_sub(nomes, 1, 5)
## [1] "PASTO" "JUNIO" "RUDIL" "NELSO" "EURIC" "DJÊ C" "PAULO" "JESUS" "CHICO" "CABRA"
str_subset()
: retorna a string com o padrão.
str_subset(nomes, "PASTOR")
## [1] "PASTOR MANUEL MARCOS"
]
str_extract_all()
: Extrai somente o padrão.
str_extract_all(nomes, "PASTOR|CHICO") # | = or
## [[1]]## [1] "PASTOR"## ## [[2]]## character(0)## ## [[3]]## character(0)## ## [[4]]## character(0)## ## [[5]]## character(0)## ## [[6]]## character(0)## ## [[7]]## character(0)## ## [[8]]## character(0)## ## [[9]]## [1] "CHICO"## ## [[10]]## character(0)
]
Na maior parte das vezes, buscamos padrões mais gerais em nossas buscas textuais. Por exemplo:
Todas as frases que terminam com a letra "a"
Todas as strings com valores numéricos.
Todas as strings se referindo a Jair Bolsonaro e algumas variações do nome.
Para fazer buscas textuais mais gerais, utilizaremos regular expressions
.
Expressões regulares são atalhos usados por todas as linguagens de programação que tornam buscas textuais mais gerais.
Não é fácil memorizar expressões regulares, portanto, aqui darei somente um passada bem geral somente para mostrar para vocês como funcionam.
^
para encontrar padrões no início do texto. $
para encontrar padrões no início do texto. tweets <- c("RT: Hello! Hello", "Hello World!")str_subset(tweets, "^RT")
## [1] "RT: Hello! Hello"
# Com !str_subset(tweets, "!")
## [1] "RT: Hello! Hello" "Hello World!"
# Terminando com !str_subset(tweets, "!$")
## [1] "Hello World!"
.
: qualquer character.\d
: digitos# Começa com R e qualquer digito.str_subset(tweets, "^R.")
## [1] "RT: Hello! Hello"
# Algums digitostr_subset(tweets, "\\d")
## character(0)
# Contem Algum dos Valoresstr_detect(c("bolsonaro", "Bolsonaros"), "[b|B]olsonaro")
## [1] TRUE TRUE
knitr::include_graphics("https://media.giphy.com/media/8ykJ4yAnwgK2I/giphy.gif")
knitr::include_graphics("https://media.giphy.com/media/8ykJ4yAnwgK2I/giphy.gif")
Até aqui, cobrimos as seguintes áreas do processo de manipulação de dados:
Básico do dplyr.
Dados tidy.
Visualização.
Hoje vamos fazer uma aula extra com alguns funcionalidades mais avançadas. São elas:
Verbos Complementares no Dplyr.
Manipulação de Strings (stringr
).
Expressões Regulares.
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
Esc | Back to slideshow |