Comment identifier/supprimer des non-caractères UTF-8 dans la R
Lorsque j'importe une Stata dataset dans R (à l'aide de la foreign
paquet), l'importation contient parfois des personnages qui ne sont pas valides UTF-8
. C'est assez désagréable en soi, mais il casse tout dès que j'essaie de transformer l'objet de JSON
(à l'aide de la rjson
package).
Comment je peux identifier les non-valides-UTF-8
de caractères dans une chaîne de caractères et de les supprimer après que?
Vous devez vous connecter pour publier un commentaire.
Une autre solution à l'aide de
iconv
et c'argumentsub
: chaîne de caractères. Si pas NA(ici je l'ai mis à "), il est utilisé pour remplacer les non-convertibles octets dans l'entrée.Ici noter que si l'on choisit le bon encodage:
Au lieu de les supprimer, vous pouvez essayer de les convertir en UTF-8 à l'aide de la chaîne
iconv
.Vous pouvez remplacer
latin1
par un plus adapté enconding dans votre cas.Puisque nous n'avons pas accès à vos données est difficile de savoir laquelle sera la plus adaptée.
Une autre approche pour enlever le mauvais caractères à l'aide dplyr sur le jeu de données entier:
Où
MyData
etMyTextVar
sont l'ensemble de données et les variables de texte pour supprimer les mauvaises pommes de. Ce sont peut-être moins robuste que la modification de l'encodage mais c'est souvent fine et plus facile de les supprimer.MyDate %>% mutate_if(is.character, ~gsub('[^ -~]', '', .))
qui cible toutes les colonnes de caractères ouMyData %>% mutate_all(~gsub('[^ -~]', '', .))
qui cible toutes les colonnes.Yihui de
xfun
paquet a une fonction,read_utf8
, qui tente de lire un fichier et suppose qu'il est codé en UTF-8. Si le fichier contient des non-UTF-8 lignes, une alerte est déclenchée, vous permettant de savoir qui de ligne(s) contiennent des caractères UTF-8. Sous le capot, il utilise une autre fonction exportéexfun:::invalid_utf8()
qui est tout simplement la suivante:which(!is.na(x) & is.na(iconv(x, "UTF-8", "UTF-8")))
.À détecter spécifiques de non-UTF-8 mots dans une chaîne de caractères, vous pouvez modifier le dessus légèrement et faire quelque chose comme: