web-dev-qa-db-fra.com

Supprimer les accents d'une colonne de trame de données dans R

J'ai une base de données.table. J'ai une colonne de termes dans ces données.

class(base$term)
[1] character
length(base$term)
[1] 27486

Je peux supprimer les accents d'une chaîne. Je suis capable de supprimer les accents d'un vecteur de chaîne.

iconv("Millésime",to="ASCII//TRANSLIT")
[1] "Millesime"
iconv(c("Millésime","boulangère"),to="ASCII//TRANSLIT")
[1] "Millesime" "boulangere"

Mais pour une raison quelconque, cela ne fonctionne pas lorsque j'applique la même fonction sur ma colonne de termes

base$terme[2]
[1] "Millésime"
iconv(base$terme[2],to="ASCII//TRANSLIT")
[1] "MillACsime"

Quelqu'un sait-il ce qui se passe ici?

14
hans glick

Ok la façon de résoudre le problème:

Encoding(base$terme[2])
[1] "UTF-8"
iconv(base$terme[2],from="UTF-8",to="ASCII//TRANSLIT")
[1] "Millesime"

Merci à @nicola

20
hans glick

Il pourrait être plus facile d'utiliser le package stringi . De cette façon, vous n'avez pas besoin de vérifier l'encodage au préalable. De plus stringi est cohérent sur tous les systèmes d'exploitation et inconv ne l'est pas.

library(stringi)

base <- data.table(terme = c("Millésime", 
                             "boulangère", 
                             "üéâäàåçêëèïîì"))

base[, terme := stri_trans_general(str = terme, 
                                   id = "Latin-ASCII")]

> base
           terme
1:     Millesime
2:    boulangere
3: ueaaaaceeeiii
12
Jeldrik

Vous pouvez appliquer cette fonction

    rm_accent <- function(str,pattern="all") {
   if(!is.character(str))
    str <- as.character(str)

  pattern <- unique(pattern)

  if(any(pattern=="Ç"))
    pattern[pattern=="Ç"] <- "ç"

  symbols <- c(
    acute = "áéíóúÁÉÍÓÚýÝ",
    Grave = "àèìòùÀÈÌÒÙ",
    circunflex = "âêîôûÂÊÎÔÛ",
    tilde = "ãõÃÕñÑ",
    umlaut = "äëïöüÄËÏÖÜÿ",
    cedil = "çÇ"
  )

  nudeSymbols <- c(
    acute = "aeiouAEIOUyY",
    Grave = "aeiouAEIOU",
    circunflex = "aeiouAEIOU",
    tilde = "aoAOnN",
    umlaut = "aeiouAEIOUy",
    cedil = "cC"
  )

  accentTypes <- c("´","`","^","~","¨","ç")

  if(any(c("all","al","a","todos","t","to","tod","todo")%in%pattern)) # opcao retirar todos
    return(chartr(paste(symbols, collapse=""), paste(nudeSymbols, collapse=""), str))

  for(i in which(accentTypes%in%pattern))
    str <- chartr(symbols[i],nudeSymbols[i], str) 

  return(str)
}
0
Alexandre Lima