Str_replace_all com vetor nomeado e caixa alta

Contexto
Estou limpando uma base de dados eleitorais com nomes em caixa alta, mas que em alguns anos vêm com acentos, e em outros não. Por exemplo: o mesmo “JOSÉ” também aparece como “JOSE”.

#Pacotes utilizados
library(tibble)
library(dplyr)
library(stringr)

#Exemplo caixa alta
teste_A ← tibble(
nome_A = c(“JOÃO”, “JOSÉ”, “JOAO”, “JOSE”)
)

Para uniformizar, resolvi excluir os acentos, e usei o stringr::str_replace_all, informando seus parâmetros normais, ou seja: string, pattern, replacement. Deu certo, mas o código ficou imenso, porque tive que replicar a função inteira para cada acento e para cada coluna.

#Multiplos str_replace_all:
teste_A |>
mutate(
nome_A = str_replace_all(nome_A, “Ô, “A”),
nome_A = str_replace_all(nome_A, “É”, “E”)
)
#A tibble: 4 x 1
nome_A
< chr>
1 JOAO
2 JOSE
3 JOAO
4 JOSE

Complicação
Lendo a seção de String do livro R4DS, vi que ele parametriza o str_replace_all com um vetor nomeado*, que serve de pattern e replacement.

#Trecho do livro:
With str_replace_all() you can perform multiple replacements by supplying a named vector:

x ← c(“1 house”, “2 cars”, “3 people”)
str_replace_all(x, c(“1” = “one”, “2” = “two”, “3” = “three”))
#> [1] “one house” “two cars” “three people”

Foi aí que lembrei do código de limpeza de acentos, e resolvi aplicar o modelo para deixá-lo mais conciso. Porém, não funcionou…

#Informando um vetor nomeado como parametro do str_replace_all
teste_A |>
mutate(
nome_A = str_replace_all(nome_A, c(“Ô = “A”, “É” = “E”))
)
#A tibble: 4 x 1
nome_A
< chr>
1 JOÃO
2 JOSÉ
3 JOAO
4 JOSE

Depois de muito fuçar, acabei percebendo que o código funciona com letras minúsculas:

#Exemplo em caixa baixa
teste_a ← tibble(
nome_a = c(“joão”, “josé”, “joao”, “jose”)
)

#Informando um vetor nomeado como parametro do str_replace_all
teste_a |>
mutate(
nome_a = str_replace_all(nome_a, c(“ã” = “a”, “é” = “e”))
)
#A tibble: 4 x 1
nome_a
< chr>
1 joao
2 jose
3 joao
4 jose

Dúvida
Alguém sabe por que o str_replace_all com vetor nomeado funcionou com letras minúsculas, mas não com maiúsculas? O que preciso ajustar para funcionar?
Pensei em informar algum locale, mas parece que isso não é parâmetro pra função…

*Obs.: estou chamando de “vetor nomeado”, numa tradução livre do livro da Hadley, mas não sei se é esse o nome corrente em português…

Oi! A sua dúvida parece que pode ser respondida em parte 1 e parte 2:

Parte 1: como fazer o que você está descrevendo de uma forma mais curta?

  • A função stringr::str_to_lower() deixa todas as letras minúsculas;
  • a função abjutils::rm_accent() remove acentos
  • A função dplyr::across() permite que você aplique uma função em mais de uma coluna, de uma vez só.
# base com 2 colunas
teste <- tibble::tibble(
  nome = c("JOÃO", "JOSÉ", "JOAO", "JOSE"),
  cidade = c("São Paulo", "Ceará", "Pará", "Rio de Janeiro")
)

# ver a base
teste

#> # A tibble: 4 × 2
#>   nome  cidade        
#>   <chr> <chr>         
#> 1 JOÃO  São Paulo     
#> 2 JOSÉ  Ceará         
#> 3 JOAO  Pará          
#> 4 JOSE  Rio de Janeiro

# usar a função str_to_lower para deixar minúsculo, 
# e rm_accent para remover acentos
# a função across serve para aplicar uma função em mais de uma coluna por vez
teste |> 
  dplyr::mutate(dplyr::across(.cols = c(nome, cidade), .fns = stringr::str_to_lower),
                dplyr::across(.cols = c(nome, cidade), .fns = abjutils::rm_accent))
#> # A tibble: 4 × 2
#>   nome  cidade        
#>   <chr> <chr>         
#> 1 joao  sao paulo     
#> 2 jose  ceara         
#> 3 joao  para          
#> 4 jose  rio de janeiro

Created on 2022-01-17 by the reprex package (v2.0.1)

Parte 2

Dúvida: “Alguém sabe por que o str_replace_all com vetor nomeado funcionou com letras minúsculas, mas não com maiúsculas? O que preciso ajustar para funcionar?”

Não tenho certeza em como responder, pois não consegui reproduzir o erro. Executando o seu código funciona tudo certo por aqui:

#Pacotes utilizados
library(tibble)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(stringr)

#Exemplo caixa alta
teste_A <- tibble(nome_A = c("JOÃO", "JOSÉ", "JOAO", "JOSE"))

teste_A |>
  mutate(
    nome_A = str_replace_all(nome_A, c("Ã" = "A", "É" = "E"))
  )
#> # A tibble: 4 × 1
#>   nome_A
#>   <chr> 
#> 1 JOAO  
#> 2 JOSE  
#> 3 JOAO  
#> 4 JOSE

Created on 2022-01-17 by the reprex package (v2.0.1)

1 Curtida

Obrigado, Beatriz!!

Pela Parte 1, ficou bem melhor assim!!

Pela Parte 2, deve ter algum problema local que eu não to sabendo identificar (talvez porque sou bem iniciante ainda). Nesse outro problema que tive (Encoding em read_csv2), o William também não conseguiu reproduzir meu problema, e eu também não soube identificar o motivo.

De qualquer forma, problema superado, e a análise segue em frente hehehe
Obrigado!

1 Curtida