3
votes

R: encodage incorrect de l'espace étroit dans la trame de données et .csv résultant

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&#8239;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.


2 commentaires

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.


3 Réponses :


3
votes

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 >


3 commentaires

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?



0
votes

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)


0 commentaires

1
votes

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 () .


0 commentaires