web-dev-qa-db-fra.com

Comment identifier / supprimer des caractères non UTF-8 dans R

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?

23
Marcel Hebing

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
23
agstudy

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)})

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.

1
Tyler Rinker

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é.

1
dickoa