En travaillant dans un langue autre que l’anglais, on est souvent amené à fréquenter des caractères exotiques : lettres munies d’accents (é), tildes (ñ), ronds (Å) et autres barres (ø) – sans compter les formes non-latines (de ∆ à भैं, en passant par ش). Mais comme l’informatique moderne a été développée avec des claviers étas-uniens, leur traitement ne va pas sans difficultés.
Des procédures standardisées, dites d’encodage, permettent d’utiliser ces caractères dans des textes ou des bases de données. Toutefois, dans le cas du français, le plus simple est bien souvent d’enlever les accents, si bien sûr on ne perd pas d’information cruciale au passage.
R permet d’effectuer cette opération, grâce à la fonction iconv
munie d’une option de translittération : é
est ainsi transformé en ´e
, par exemple. On enlève ensuite les apostrophes (et équivalents) pour compléter la procédure de désaccentuation. Pour le faire de manière systématique, on définit la fonction suivante:
Unaccent <- function(text) {
text <- gsub("['`^~\"]", " ", text)
text <- iconv(text, to="ASCII//TRANSLIT//IGNORE")
text <- gsub("['`^~\"]", "", text)
return(text)
}
Il suffit d’exécuter ces quelques lignes au début d’un script R et cette fonction Unaccent
devient disponible pour toute la suite de votre programme. Trois remarques:
- Elle ne fonctionne que pour les caractères latins.
- Les apostrophes et guillemets anglais sont également évacués, et remplacés par des espaces.
- Vous venez de créer une fonction en R, un outil très utile qui permet d’empaqueter un ensemble d’instructions (éventuellement long) plutôt que de les réécrire à chaque fois.
Son utilisation donne ainsi :
> Unaccent("à é î ø ü ç ß ñ ƒ")
[1] "a e i o u c ss n f"
> Unaccent("J'ai dévoré les Grundriße")
[1] J ai devore les Grundrisse
Attention, les caractères non-latins sont purement et simplement effacés :
> Unaccent("∆")
[1] ""
Il est possible de travailler en gardant l’ensemble des caractères et des accents, mais cela nécessite d’être extrêmement soigneux dans la manipulation des encodages, voire des expressions régulières. Ces sujets, très techniques, seront abordés prochainement. Mais si vous pouvez y échapper, profitez-en !
OpenEdition vous propose de citer ce billet de la manière suivante :
Alexandre Hobeika (11 mars 2013). Enlever les accents (avec R). Data Sciences Sociales. Consulté le 9 décembre 2024 à l’adresse https://doi.org/10.58079/ngxr
J’ai tenté une micro amélioration…
Unaccent<-function(text) {
text <- gsub("['`^~\"]", " ", text)
text <- iconv(text,from = Encoding(text), to="ASCII//TRANSLIT//IGNORE")
text <- gsub("['`^~\"]", "", text)
return(text)
}
Bonjour,
chez moi “règlement” se transforme en “rA?glement”
Savez-vous pourquoi ou comment résoudre ce soucis ?
Merci,
Cordialement,
Cyprien
Bonjour,
Chez moi (macOS 10.12) ça fonctionne correctement. Il me faudrait plus d’informations pour comprendre la source du problème. Vous tapez la commande Unaccent(“règlement”) manuellement ou vous l’appliquez à un fichier de données que vous avez importé ? Et que donnent les commandes Sys.info() et Sys.getlocale() sur votre machine ?
Bonjour Cyprien,
J’arrive un peu tard mais je réponds pour que cela puisse aider dans le futur.
J’ai eu le même problème, il faut simplement préciser le quel est l’encodage d’origine de l’objet avec la variable “from”. Par exemple ici pour un dataframe en UTF-8, la deuxième ligne de la fonction devient :
text <- iconv(text, from="UTF-8", to="ASCII//TRANSLIT//IGNORE")
Merci Alexandre pour cette fonction très utile !
Toni
Votre fonction m’a super aidé et m’éviter ainsi des heures à matcher des trucs à la main de façon mécanique.
Merci beaucoup pour ce partage!
Ping : Quantification du travail parlementaire, pour quelques variables en plus | Polit’bistro : des politiques, du café
Ping : Collecter des donnés sur Wikipédia : l’exemple des salles du culte musulman à Paris | Data Sciences Sociales
Bonjour, merci beaucoup de votre message,
Je ne suis pas certain de ce que vous désignez par “non-conforme”, mais j’imagine qu’il s’agit d’un fichier de données (par exemple CSV) dont l’importation donne des caractères bizarres dans les champs de texte, du genre “
Ã@
“, “\x8e
” ou “\u0089
“…Si c’est le cas, alors au moment de l’importation il faut spécifier l’encodage utilisé pour créer ce fichier de données, à savoir la table de correspondance entre les octets et les caractères. D’habitude si on ne spécifie rien, alors ça marche pour les fichier créés avec un encodage ASCII, ISO-8859-1 (dit “LATIN1”), ou Unicode (“UTF-8”).
Les encodages utilisés les plus couramment en dehors de ces deux-là sont “WINDOWS-1252” (ou “CP1252”, parfois aussi appelé “ANSI”) sous Windows, et “MACROMAN” sous Mac OS.
Si vous utilisez une fonction d’importation de la famille des
read.table()
, comme par exempleread.csv2()
, cela s’écrit alors ainsi :mon.dataset <- read.csv2(file="…/monfichier.csv",
fileEncoding="WINDOWS-1252")
Pour voir la liste des encodages disponibles sous R sur votre machine, vous pouvez utiliser la fonction
iconvlist()
.Une fois que l’importation s’est effectuée correctement, vous pourrez ensuite enlever les accents sans difficulté.
Est-ce que cela répond à votre problème ?
Alexandre
Bonjour,
superbe procédure ! Bravo.
mais par contre question pour l’import d’un data frame non conforme, comment fait-on avant, puisque en principe il ne faut importer qu’après nettoyage (que je fais aujourd’hui avec cmdaccut de Pierre Torris.
pourriez vous préciser la procédure complète avant et après le nettoyage ?
Charles-André