web-dev-qa-db-fra.com

Imprimer la chaîne de caractères unicode en R

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:

enter image description here

test=read.csv("test.csv")

enter image description here

\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!

23
outboundbird

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))
43
MrFlick