Dans l’article précédent, consacré à la production d’une représentation cartographique avec R, le tableau de données pris en entrée a été lu avec la fonction read.csv()
. Comme son nom l’indique, cette fonction permet de lire des données structurées au format CSV, à partir d’une URL ou du chemin d’accès d’un fichier, afin de les convertir en un type de données propre à R et les manipuler.
Cependant, en fonction du ou des systèmes d’écriture présents dans le document d’origine, il peut arriver que les caractères soient affichés de façon erratique. Voici comment résoudre le problème, simplement en déclarant les paramètres appropriés de read.csv()
.
Le script R ne figure pas intégralement dans l’article. Vous pouvez le télécharger sur Github et le réutiliser librement.
Données d’entrée
Les données prises en entrée dans l’exemple sont issues de la compilation des tableaux présentés respectivement dans les articles Lexique linguistique en japonais – 1 et Lexique linguistique en japonais – 2 de ce carnet. Le fichier TSV1 qui en est issu est disponible sur Github.
Ce petit lexique thématique bilingue comporte du texte en japonais (hiragana, katakana et kanji) ainsi qu’en français, avec des caractères accentués et quelques signes de ponctuation. Les étiquettes de colonnes, en français, contiennent également des caractères spéciaux.
L’URL utilisée dans le script est celle de la version “raw” du document, qui ne comporte pas l’interface de Github.
Convertir le tableau en data frame
Comme vous le savez peut-être déjà, notamment si vous avez lu l’article consacré à la cartographie linguistique avec R, la fonction read.csv()
lit les données d’un tableau à partir d’un fichier ou d’une URL, et renvoie un data frame. Cette conversion au format data frame permet de manipuler et visualiser les données avec R.
L’URL du fichier d’entrée a été associée à la variable fichier_lexique
, voici donc comment le lire avec read.csv()
:
lexique = read.csv(fichier_lexique, sep = '\t')
Taper cette commande dans la console R ou l’exécuter via un script ne soulèvera pas d’erreur2, mais visualiser le data frame avec View(lexique)
fera éventuellement apparaître ceci :
Le fichier d’entrée est encodé en UTF-8 mais son contenu semble avoir été décodé en ASCII, ce qui altère les caractères japonais et les caractères accentués. Ce n’est pas un défaut d’affichage avec View()
, les données se présentent de cette façon également dans la console :
De même, appeler lexique$Kanji[6]
renvoie [1] "å’Œä»\u008f辞典"
, appeler lexique$FranÃ.ais[11]
3 renvoie [1] "abréviation"
…
La solution est en fait très simple et se retrouve facilement avec help("read.csv")
: la fonction read.csv()
dispose d’un paramètre encoding
. Pour certains fichiers il est possible de s’en passer4, mais il est ici indispensable de le spécifier.
lexique = read.csv(fichier_lexique,
sep = '\t',
header = TRUE,
encoding = "UTF-8")
Le tableau affiché par View(lexique)
a maintenant cet aspect :
C’est bien mieux, puisque les caractères contenus dans les cellules du tableau s’affichent parfaitement. Mais regardez la ligne d’étiquettes : le ç de Français est certes affiché, mais les autres caractères spéciaux y sont remplacés par des points alors qu’ils ne le sont pas dans les cellules.
Gérer les caractères de la ligne d’étiquettes
Encore une fois, cette altération du contenu d’origine ne se limite pas à la visualisation avec View()
, c’est une “vraie” modification du contenu textuel.
Certains caractères ont été remplacés, pourtant tout va bien au niveau de l’encodage. Ce qui se produit en fait ici est que ces caractères spéciaux5 ne sont normalement pas admis dans les noms de variables de R. Lors de la lecture des données avec read.csv()
, ils sont donc remplacés automatiquement par un autre caractère, acceptable dans un nom de variable.
Il s’agit d’un dispositif visant à favoriser le bon traitement des données ; si vos étiquettes de colonnes comportent ce type de caractères spéciaux, il faut alors faire preuve de prudence avant de le désactiver. C’est la valeur du paramètre check.names
qui est à modifier. D’après la documentation6 :
check.names logical. If TRUE then the names of the variables in the data frame are checked to ensure that they are syntactically valid variable names. If necessary they are adjusted (by make.names) so that they are, and also to ensure that there are no duplicates
Passer la valeur de check.names
à FALSE
permettra de conserver les étiquettes de colonnes telles qu’elles sont dans la source, quels que soient les caractères qui les composent.
lexique = read.csv(fichier_lexique,
sep = '\t',
header = TRUE,
encoding = "UTF-8",
check.names = FALSE)
Le code ci-dessus va ainsi donner lieu à ce tableau7 :
Les colonnes ont conservé leur titre d’origine et elles peuvent maintenant être appelées dans un script ou dans la console avec la syntaxe suivante, respectivement : lexique$Kanji
, lexique3$`Hiragana/Katakana`
, lexique3$`Rōmaji (Hepburn)`
et lexique3$Français
.
Le script disponible sur Github contient le code permettant de reproduire les trois essais d’application de la fonction read.csv()
présentés dans cet article.
- Pour rappel, il s’agit d’un fichier CSV dont le séparateur est une tabulation. Il peut être traité par R en tant que fichier CSV, à condition de spécifier le séparateur. [↩]
- Sauf bien entendu si vous n’avez pas accès à Internet. [↩]
- Et
lexique$Français
ne fonctionne pas, bien entendu. [↩] - C’était le cas avec ce fichier utilisé pour générer une carte. [↩]
- Dans le cas présent : /, (, ), et ō. [↩]
- Consultable en tapant
help("read.csv")
dans la console. [↩] View(lexique)
[↩]
OpenEdition vous propose de citer ce billet de la manière suivante :
Alexander Delaporte (11 octobre 2022). R et encodage des caractères. Tekipaki. Consulté le 11 décembre 2024 à l’adresse https://doi.org/10.58079/up2v