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() :

idosos$Modosagrupados= str_to_upper(idosos$Modosagrupados)

unique(idosos$Modosagrupados)
## [1] "COLETIVO"       "NÃO MOTORIZADO" "INDIVIDUAL"     "OUTROS"         ""

Já a função str_to_lower() transforma todos caracteres em letra minúscula

idosos$Modosagrupados= str_to_lower(idosos$Modosagrupados)

unique(idosos$Modosagrupados)
## [1] "coletivo"       "não motorizado" "individual"     "outros"         ""

Por fim, a função str_to_title() mantém apenas a primeira letra como maiúscula

idosos$Modosagrupados= str_to_title(idosos$Modosagrupados)

unique(idosos$Modosagrupados)
## [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.

idosos$UDM=str_sub(idosos$UDM, start = 5) 

Vejamos o resultado final:

unique(idosos$UDM)
## [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.

idosos$UDM= str_trim(idosos$UDM)

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 "\)”.

str_detect(idosos$UDM, pattern = "filhos$")
##    [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.

idososrenda=idosos%>%filter(str_detect(Renda, "3"))

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:

idosos$Idoso=str_replace(idosos$Idoso, "1", "Sim")

unique(idosos$UDM)
## [1] "Sozinhos"         "Casal com filhos" "Casal"            "Monoparental"    
## [5] "Outros"           ""

Caso tivéssemos duas ou mais categorias para substituir

idosos$Idoso <- str_replace_all(idosos$Idoso, c("1" = "Sim", "0" = "Não"))


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.

idosos$Renda <- str_replace_all(idosos$Renda, " ", "")

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:

idosos$UDM <- str_replace(idosos$UDM, "^(Casal)$", "Casal sem filhos")

unique(idosos$UDM)
## [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.

crimes=read.csv("crimes_violentos_2024.csv",sep=";")

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.

idosos$motivo_origem<- str_extract(idosos$motivo_origem, "^\\w+")

unique(idosos$motivo_origem)
##  [1] "Residência" "Escola"     "Lazer"      "Trabalho"   "Saúde"      "Compras"   
##  [7] "Negócios"   "Levando"    "Refeição"   "Transbordo" "Outros"     "Fazer"     
## [13] NA
idosos$motivo_destino<- str_extract(idosos$motivo_destino, "^\\w+")

unique(idosos$motivo_destino)
##  [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.

idosos$ordes<- str_c(idosos$motivo_origem,"para",idosos$motivo_destino)

unique(idosos$ordes)
##   [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