J'ai entré une chaîne de texte dans .csv
fichier, qui comprend des symboles Unicode comme: \U00B5
g/dL. Dans .csv
fichier ainsi que lu dans la trame de données R:
test=read.csv("test.csv")
\U00B5
produirait le micro-signe µ. R le lire dans le fichier de données tel quel (\U00B5
). Cependant, lorsque j'imprime la chaîne, elle s'affiche comme \\U00B5 g/dL
.
Alternativement, la saisie manuelle du code fonctionne correctement.
varname <- c("a", "b", "c")
labels <- c("A \U00B5 g/dL", "B \U00B5 g/dL", "C \U00B5 g/dL")
df <- data.frame(varname, labels)
test <- data.frame(varname, labels)
test
# varname labels
# 1 a A µ g/dL
# 2 b B µ g/dL
# 3 c C µ g/dL
Je me demande comment pourrais-je me débarrasser du signe d'échappement \
dans ce cas et faites imprimer le symbole. Ou, s'il existe une autre façon d'imprimer le symbole en R.
Merci beaucoup pour cette aide!
Eh bien, comprenez d'abord que certains caractères de R doivent être échappés s'ils sont en dehors des caractères ASCII standard. En général, cela se fait avec un caractère "\". C'est pourquoi vous devez échapper à ce caractère lorsque vous écrivez une chaîne en R:
a <- "\" # error
a <- "\\" # ok.
Le "\ U" est un indicateur spécial pour l'échappement unicode. Notez qu'il n'y a pas de barres obliques ou de U dans la chaîne elle-même lorsque vous utilisez cet échappement. Ce n'est qu'un raccourci vers un caractère spécifique. Remarque:
a <- "\U00B5"
cat(a)
# µ
grep("U",a)
# integer(0)
nchar(a)
# [1] 1
C'est très différent de la chaîne
a <- "\\U00B5"
cat(a)
# \U00B5
grep("U",a)
# [1] 1
nchar(a)
# [1] 6
Normalement, lorsque vous importez un fichier texte, vous encodez des caractères non ASCII dans le codage utilisé par le fichier (UTF-8 ou Latin-1 sont les plus courants). Ils ont des octets spéciaux pour représenter ces caractères. Il n'est pas "normal" qu'un fichier texte ait une séquence d'échappement ASCII pour les caractères unicode. C'est pourquoi R n'essaie pas de convertir "\ U00B5" en caractère unicode car il suppose que si vous aviez voulu un caractère unicode, vous l'auriez simplement utilisé directement.
La façon la plus simple de réinterpréter vos valeurs de caractères ASCII serait d'utiliser le package stringi
. Par exemple
library(stringi)
a <- "\\U00B5"
stri_unescape_unicode(gsub("\\U","\\u",a, fixed=TRUE))
(le seul hic est que nous devions convertir "\ U" en "\ u" plus commun pour que la fonction reconnaisse correctement l'échappement). Vous pouvez le faire avec vos données importées avec
test$label <- stri_unescape_unicode(gsub("\\U","\\u",test$label, fixed=TRUE))