Lorsque j'importe un jeu de données STATA dans [~ # ~] r [~ # ~ ~] (Utilisation du package foreign
), l'importation contient parfois des caractères qui ne sont pas valides UTF-8
. C'est assez désagréable de lui-même, mais cela brise tout dès que j'essaie de transformer l'objet à JSON
(en utilisant le package rjson
).
Comment puis-je identifier non-valide -UTF-8
- Personnages dans une chaîne et supprimez-les après cela?
Une autre solution utilisant iconv
et argument informatique sub
: chaîne de caractères. Si non na (ici, je l'ai défini sur ''), il est utilisé pour remplacer tous les octets non convertibles dans l'entrée.
x <- "fa\xE7ile"
Encoding(x) <- "UTF-8"
iconv(x, "UTF-8", "UTF-8",sub='') ## replace any non UTF-8 by ''
"faile"
Notez ici que si nous choisissons le bon codage:
x <- "fa\xE7ile"
Encoding(x) <- "latin1"
xx <- iconv(x, "latin1", "UTF-8",sub='')
facile
Une autre approche pour éliminer les mauvais caractères en utilisant dplyr sur l'ensemble du jeu de données:
library(dplyr)
MyDate %>%
mutate_at(vars(MyTextVar1, MyTextVar2), function(x){gsub('[^ -~]', '', x)})
Où MyData
et MyTextVar
sont le jeu de données et les variables de texte pour éliminer les mauvaises pommes de. Cela peut être moins robuste que le changement de codage, mais souvent, c'est bien et plus facile de les supprimer.
Au lieu de les supprimer, vous pouvez essayer de les convertir en chaîne UTF-8 en utilisant iconv
.
require(foreign)
dat <- read.dta("data.dta")
for (j in seq_len(ncol(dat))) {
if (class(dat[, j]) == "factor")
levels(dat[, j]) <- iconv(levels(dat[, j]), from = "latin1", to = "UTF-8")
}
Vous pouvez remplacer latin1
par un enconding plus approprié dans votre cas. Puisque nous n'avons pas accès à vos données, il est difficile de savoir lequel sera plus approprié.