5.3 Pacote stringr
5.3.1 Customizando o texto
Essas funções servem para modificar a caixa das letras. Veja alguns exemplos:
Vamos transformar todos caracteres da variável Modosagrupados em letra maiúscula utilizando a função str_to_upper() :
## [1] "COLETIVO" "NÃO MOTORIZADO" "INDIVIDUAL" "OUTROS" ""
Já a função str_to_lower() transforma todos caracteres em letra minúscula
## [1] "coletivo" "não motorizado" "individual" "outros" ""
Por fim, a função str_to_title() mantém apenas a primeira letra como maiúscula
## [1] "Coletivo" "Não Motorizado" "Individual" "Outros" ""
5.3.2 Subtraindo elementos
A função str_sub() permite extrair uma parte fixa de uma string. Por exemplo, digamos que na variável UDM, queremos manter apenas o nome da categoria, sem a numeração que aparece antes. Para isso, contamos quantos caracteres temos antes do nome de cada categorias. Contando com os espaços, detectamos 5 caracteres.
Logo, dizemos ao R que queremos guardar apenas o que vier após o 5o caractere.
Vejamos o resultado final:
## [1] "Sozinhos" "Casal com filhos" "Casal" "Monoparental"
## [5] "Outros" ""
Além disso, a função str_trim() ajuda removendo os espaços excedentes antes e depois da string. Essa prática pode criar problemas pois o R considera como categorias diferentes, devido a apenas um espaço.
5.3.3 Detectando padrões
A função str_detect() retorna TRUE se uma string atende a uma expressão regular e FALSE caso contrário. Digamos que queremos detectar, na variável UDM, todas categorias que terminem com a palavra “filhos”. A regex “filhos\(" indica que o texto deve ser terminado em “paulo”. Existem diversos caracteres auxiliares que vão auxiliar na manipulação dos textos, assim como o "\)”.
## [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [15] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [29] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
## [43] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
## [57] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
## [71] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [99] FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [113] TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [127] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
## [141] TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [155] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
## [183] TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [197] TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [211] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [225] FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [239] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [253] FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [267] FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
## [281] FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
## [295] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE
## [309] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [323] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [337] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [351] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [365] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
## [379] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [393] FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [407] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [421] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [435] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [449] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [463] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
## [477] TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
## [491] FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
## [505] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [519] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE
## [533] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [547] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
## [561] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [575] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [589] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE
## [603] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [617] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [631] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [645] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [659] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [673] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE
## [687] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
## [701] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [715] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
## [729] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [743] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [757] TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [771] FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [785] FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [799] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE
## [813] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [827] FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
## [841] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [855] FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE FALSE FALSE
## [869] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [883] FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
## [897] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [911] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
## [925] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE
## [939] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [953] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
## [967] TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
## [981] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
## [995] FALSE TRUE TRUE TRUE TRUE FALSE
## [ reached getOption("max.print") -- omitted 922480 entries ]
A função str_detect() pode ser combinada com outras, como ifelse ou filter, do dplyr. Digamos que queremos criar um novo dataframe guardando apenas os indivíduos que ganham Até 3SM ou De 3 a 5 SM. Para isso, propomos uma função de filter, indicando que a filtragem será realizada toda vez que o str_detect() encontrar o caractere “3” na variável Renda.
5.3.4 Substituindo caracteres
Substituindo uma ou mais categorias
Vamos substituir o valor “1” na variável Idoso por “Sim”. Utilizemos a expressão abaixo:
## [1] "Sozinhos" "Casal com filhos" "Casal" "Monoparental"
## [5] "Outros" ""
Caso tivéssemos duas ou mais categorias para substituir
Removendo espaços
Podemos também utilizar o str_replace para remover os espaços entre os caracteres. Por exemplo, digamos que na variável Renda, queremos que todo o texto fique agrupado, sem espaços.
Combinando o str_detect e o str_replace
Podemos também combinar as funções str_detect() e str_replace(). Na variável UDM temos as categorias “Casal” e “Casal com filhos”. Digamos que queremos substituir a categoria “Casal” por “Casal sem filhos”. Utilizamos a seguinte expressão:
## [1] "Sozinhos" "Casal com filhos" "Casal sem filhos" "Monoparental"
## [5] "Outros" ""
A expressão “^(Casal)$” utilizada acima indica que:
^ é o início da string. Isso significa que a correspondência só ocorrerá se “Casal” estiver no início da string. Portanto, a string não pode ter nenhum outro texto antes da palavra “Casal”.
(Casal) representa o texto que queremos encontrar exatamente
$ é o final da string. Isso significa que a correspondência só ocorrerá se “Casal” estiver no final da string, ou seja, a string não pode ter nenhum outro texto depois da palavra “Casal”
Str_replace e múltiplas condições
Poderíamos utilizar o str_replace com mais de uma condição. Vamos carregar o dataframe crimes_violentos_2024.csv, utilizado no exercício da última aula.
Digamos que queremos transformar todas categorias que começam com a palavra “Estupro” em “Estupro”, todas que começam com a palavra Homicídio em “Homicídio” e assim por diante. Primeiro criamos um objeto chamado cats, no qual indicaremos quais categorias queremos procurar e quais serão as novas categorias.
A expressão regular aqui significa “qualquer string que comece com ‘estupro’ e tenha qualquer coisa depois”, onde .* corresponde a qualquer sequência de caracteres após “estupro”(repetindo a mesma lógica para as outras palavras.)
cats <- c("Estupro.*" = "Estupro", "Sequestro.*" = "Sequestro",
"Roubo.*" = "Roubo", "Extorsão.*" = "Extorsão",
"Homicídio.*" = "Homicídio")
crimes$natureza <- str_replace_all(crimes$natureza, cats)
unique(crimes$natureza)
## [1] "Estupro" "Extorsão" "Homicídio" "Roubo" "Sequestro"
5.3.5 Extraindo padrões
As funções str_extract() e str_extract_all() extraem padrões de uma string.
Digamos que nas variáveis motivo_origem e motivo_destino, queiramos guardar apenas a primeira palavra. ^: significa o início da string. \w+: significa uma sequência de caracteres alfanuméricos, ou seja, uma palavra.
## [1] "Residência" "Escola" "Lazer" "Trabalho" "Saúde" "Compras"
## [7] "Negócios" "Levando" "Refeição" "Transbordo" "Outros" "Fazer"
## [13] NA
## [1] "Estudos" "Residência" "Lazer" "Trabalho" "Saúde" "Compras"
## [7] "Negócios" "Levando" "Refeição" "Transbordo" "Outros" "Fazer"
## [13] NA
5.3.6 Juntando caracteres
A função str_c() funciona da mesma forma que o paste.
## [1] "ResidênciaparaEstudos" "EscolaparaResidência" "ResidênciaparaLazer"
## [4] "LazerparaResidência" "ResidênciaparaTrabalho" "TrabalhoparaResidência"
## [7] "ResidênciaparaSaúde" "SaúdeparaResidência" "ResidênciaparaCompras"
## [10] "ComprasparaResidência" "NegóciosparaCompras" "ComprasparaNegócios"
## [13] "ResidênciaparaNegócios" "NegóciosparaResidência" "TrabalhoparaLazer"
## [16] "ResidênciaparaLevando" "LevandoparaResidência" "LazerparaLazer"
## [19] "ResidênciaparaResidência" "ComprasparaCompras" "SaúdeparaCompras"
## [22] "SaúdeparaLevando" "NegóciosparaNegócios" "ResidênciaparaRefeição"
## [25] "RefeiçãoparaResidência" "ResidênciaparaTransbordo" "TransbordoparaLazer"
## [28] "SaúdeparaNegócios" "NegóciosparaOutros" "OutrosparaSaúde"
## [31] "SaúdeparaLazer" "LazerparaCompras" "ResidênciaparaFazer"
## [34] "NegóciosparaFazer" "ResidênciaparaOutros" "OutrosparaResidência"
## [37] "FazerparaTrabalho" "TrabalhoparaRefeição" "RefeiçãoparaTrabalho"
## [40] "LevandoparaLazer" "LazerparaLevando" "TrabalhoparaSaúde"
## [43] "LazerparaOutros" "RefeiçãoparaLazer" "TrabalhoparaLevando"
## [46] "ComprasparaRefeição" "LevandoparaCompras" "TrabalhoparaCompras"
## [49] "SaúdeparaSaúde" "LazerparaSaúde" "LevandoparaNegócios"
## [52] "ComprasparaLazer" "RefeiçãoparaSaúde" "TrabalhoparaTrabalho"
## [55] "SaúdeparaOutros" "EscolaparaCompras" "OutrosparaCompras"
## [58] "ComprasparaOutros" "OutrosparaTrabalho" "LevandoparaSaúde"
## [61] "TransbordoparaResidência" "EscolaparaEstudos" "LevandoparaEstudos"
## [64] "TrabalhoparaFazer" "OutrosparaOutros" "LazerparaNegócios"
## [67] "NegóciosparaLazer" "ComprasparaFazer" "NegóciosparaRefeição"
## [70] "OutrosparaNegócios" "TrabalhoparaOutros" "LevandoparaOutros"
## [73] "TrabalhoparaNegócios" "RefeiçãoparaCompras" "LevandoparaLevando"
## [76] "OutrosparaEstudos" "OutrosparaLazer" "TransbordoparaSaúde"
## [79] "TransbordoparaTrabalho" "RefeiçãoparaNegócios" "RefeiçãoparaLevando"
## [82] "TransbordoparaFazer" "ComprasparaTransbordo" "OutrosparaTransbordo"
## [85] "OutrosparaLevando" "RefeiçãoparaFazer" "NegóciosparaLevando"
## [88] "LevandoparaTrabalho" "SaúdeparaTrabalho" "ComprasparaTrabalho"
## [91] "LazerparaRefeição" "SaúdeparaFazer" "TrabalhoparaEstudos"
## [94] "SaúdeparaTransbordo" "ComprasparaLevando" "NegóciosparaSaúde"
## [97] "LazerparaTransbordo" "OutrosparaFazer" "SaúdeparaEstudos"
## [100] "LevandoparaTransbordo" "EscolaparaTrabalho" "EscolaparaRefeição"
## [103] "ComprasparaSaúde" "FazerparaResidência" "TrabalhoparaTransbordo"
## [106] "TransbordoparaRefeição" "NegóciosparaTransbordo" "RefeiçãoparaOutros"
## [109] "RefeiçãoparaRefeição" "LevandoparaRefeição" "SaúdeparaRefeição"
## [112] "LazerparaTrabalho" "NegóciosparaTrabalho" "OutrosparaRefeição"
## [115] "TransbordoparaCompras" "TransbordoparaNegócios" "LazerparaEstudos"
## [118] "LazerparaFazer" "FazerparaSaúde" "FazerparaCompras"
## [121] "TransbordoparaOutros" "TransbordoparaTransbordo" "FazerparaLazer"
## [124] NA