J'ai récupéré des données et j'ai reçu des variables de caractères contenant un espace étroit sans interruption (unicode U + 202F). La variable de caractère résultante apparaît bien dans R si elle est dans un vecteur. Par exemple, le retour du test apparaît avec un espace étroit dans la console:
test <- "variable1 variable2" <br> test
(code html ici car l'environnement de code n'affiche pas l'espace étroit)
Cependant, si j'ajoute le vecteur à une liste / cadre de données / tibble, il apparaît comme variable1 variable2
. Si j'enregistre cette trame de données en tant que fichier csv avec fileEncoding = "UTF-8"
et que je l'ouvre avec l'encodage correspondant, apparaît toujours dans les observations. Ma solution de contournement pour le moment est d'utiliser gsub, mais je me demande ce que je fais de mal.
3 Réponses :
Le contrevenant est format.default
:
format.character <- function(x, ...) x DF <- data.frame(x = 1:5) #beware of stringsAsFactors DF$test <- test DF #spaces are actually thin spaces in R console # x test #1 1 variable1â¯variable2 #2 2 variable1â¯variable2 #3 3 variable1â¯variable2 #4 4 variable1â¯variable2 #5 5 variable1â¯variable2
format
est appelé par format.data.frame code > qui à son tour est appelé par
print.data.frame
.
Une solution pourrait être de définir une méthode de caractères:
test <- "variable1\u202Fvariable2" print(test) [1] "variable1â¯variable2" format(test) #[1] "variable1<U+202F>variable2"
De toute évidence, une méthode aussi simple cassera les fonctions reposant sur d'autres arguments format
.
OTOH, pourquoi vous souciez-vous de la façon dont les espaces sont imprimés?
p >
Je me fiche de la façon dont ils sont imprimés mais les observations dans le fichier csv résultant doivent être exactement le texte gratté, c'est-à-dire "variable1 variable2"
, pas "variable1 variable2" < / code>
Eh bien, vous êtes évidemment en train de coder l'enfer. Je ne sais pas comment réparer l'exportation de fichiers.
Serait-il possible d'afficher du code reproductible incluant le grattage?
Une méthode consiste à convertir tous les caractères Unicode en vides en utilisant gsub
:
> format(text) [1] "variable1<U+202F>variable2" > format(new_text) [1] "variable1 variable2"
Ici, je fais correspondre la négation de tous les caractères ASCII couramment utilisés, allant du code hexadécimal 20 (ESPACE) à 7E (~). L'inconvénient de cette méthode est que vous pouvez involontairement supprimer plus que ce que vous souhaitez, mais vous pouvez toujours ajouter des exclusions à la classe de caractères.
Sortie:
text <- "variable1\u202Fvariable2" new_text <- gsub("[^\x20-\x7E]", " ", text)
Personne ayant le même problème: il existe un package appelé textclean
qui remplace ou supprime les caractères non-ascii par replace_non_ascii ()
.
Quel est le problème avec l'utilisation de
gsub
, ou regex d'ailleurs?Il est sujet aux erreurs et constitue une solution de contournement plutôt qu'une solution.