Search code examples
rstringiaccent-sensitive

stringi R ignore accents special characters to match


I have two dataframes columns, one containing names with accents and the other don't. I want to match them but only exact matches are performed. For example:

df<-data.frame(not_accented=c("ACARAU CE","ADRIANOPOLIS PR", "AFUA PA","AMAPARI AP","AGUA CLARA MS",
      "AGUA DOCE MA","AGUA NOVA RN","AGUA PRETA PE","AGUAS VERMELHAS MG",
      "ALEGRETE DO PIAUI PI","ALIANCA PE","ALTO ALEGRE DO PINDARE MA","ALTO LONGA PI",
      "ALVARAES AM","ALVINOPOLIS MG","AMERICA DOURADA BA","ANAGE BA","ANAJAS PA",
      "ANGICAL DO PIAUI PI","ANTONIO CARLOS SC","ANTONIO DIAS MG","ANTONIO GONCALVES BA",
      "ANTÔNIO JOÃO MS","example","example2"))
df2<-data.frame(accented=c("ACARAÚ CE","ADRIANÓPOLIS PR", "AFUÁ PA","ÁGUA BRANCA DO AMAPARI AP","ÁGUA CLARA MS",
                           "ÁGUA DOCE DO MARANHÃO MA","ÁGUA NOVA RN","ÁGUA PRETA PE","ÁGUAS VERMELHAS MG",
                           "ALEGRETE DO PIAUÍ PI","ALIANÇA PE","ALTO ALEGRE DO PINDARÉ MA","ALTO LONGÁ PI",
                           "ALVARÃES AM","ALVINÓPOLIS MG","AMÉRICA DOURADA BA","ANAGÉ BA","ANAJÁS PA",
                           "ANGICAL DO PIAUÍ PI","ANTÔNIO CARLOS SC","ANTÔNIO DIAS MG","ANTÔNIO GONÇALVES BA",
                           "ANTONIO JOAO MS","example","example2"))

df %>% filter(df$not_accented %in% df2$accented)

See that only "example" and "example2" are kept in df. I tried to use the below solution but it is very inefficient given the size of my dataset.

df$not_accented<- stri_replace_all_regex(df$not_accented,
                                  pattern=c("ACARAU CE","ADRIANOPOLIS PR", "AFUA PA","AMAPARI AP","AGUA CLARA MS",
                                            "AGUA DOCE MA","AGUA NOVA RN","AGUA PRETA PE","AGUAS VERMELHAS MG",
                                            "ALEGRETE DO PIAUI PI","ALIANCA PE","ALTO ALEGRE DO PINDARE MA","ALTO LONGA PI",
                                            "ALVARAES AM","ALVINOPOLIS MG","AMERICA DOURADA BA","ANAGE BA","ANAJAS PA",
                                            "ANGICAL DO PIAUI PI","ANTONIO CARLOS SC","ANTONIO DIAS MG","ANTONIO GONCALVES BA",
                                            "ANTONIO JOAO MS"),
                                  replacement=c("ACARAÚ CE","ADRIANÓPOLIS PR", "AFUÁ PA","ÁGUA BRANCA DO AMAPARI AP","ÁGUA CLARA MS",
                                                "ÁGUA DOCE DO MARANHÃO MA","ÁGUA NOVA RN","ÁGUA PRETA PE","ÁGUAS VERMELHAS MG",
                                                "ALEGRETE DO PIAUÍ PI","ALIANÇA PE","ALTO ALEGRE DO PINDARÉ MA","ALTO LONGÁ PI",
                                                "ALVARÃES AM","ALVINÓPOLIS MG","AMÉRICA DOURADA BA","ANAGÉ BA","ANAJÁS PA",
                                                "ANGICAL DO PIAUÍ PI","ANTÔNIO CARLOS SC","ANTÔNIO DIAS MG","ANTÔNIO GONÇALVES BA",
                                                "ANTONIO JOAO MS"),
                                  vectorize=FALSE)

Solution

  • df %>% 
      filter(df$not_accented %in% stringi::stri_trans_general(df2$accented, 'LATIN-ASCII'))
    
                    not_accented
    1                  ACARAU CE
    2            ADRIANOPOLIS PR
    3                    AFUA PA
    4              AGUA CLARA MS
    5               AGUA NOVA RN
    6              AGUA PRETA PE
    7         AGUAS VERMELHAS MG
    8       ALEGRETE DO PIAUI PI
    9                 ALIANCA PE
    10 ALTO ALEGRE DO PINDARE MA
    11             ALTO LONGA PI
    12               ALVARAES AM
    13            ALVINOPOLIS MG
    14        AMERICA DOURADA BA
    15                  ANAGE BA
    16                 ANAJAS PA
    17       ANGICAL DO PIAUI PI
    18         ANTONIO CARLOS SC
    19           ANTONIO DIAS MG
    20      ANTONIO GONCALVES BA
    21                   example
    22                  example2