Как определить / удалить символы, отличные от UTF-8 в R

когда я импортирую набор данных Stata в R (используя внешний пакет), импорт иногда содержит символы, которые не являются допустимыми UTF-8. Это достаточно неприятно само по себе, но он ломает все, как только я пытаюсь преобразовать объект в JSON (используя пакет rjson).

У вас есть идея, как я могу идентифицировать недействительные-UTF-8-символы в строке и удалить их после этого?

3 ответов


другое решение с использованием iconv и это аргумент sub: строку символов. Если не NA(здесь я установил его в"), он используется для замены любых неконвертируемых байтов на входе.

x <- "fa\xE7ile"
Encoding(x) <- "UTF-8"
iconv(x, "UTF-8", "UTF-8",sub='') ## replace any non UTF-8 by ''
"faile"

здесь обратите внимание, что если мы выберем правильную кодировку:

x <- "fa\xE7ile"
Encoding(x) <- "latin1"
xx <- iconv(x, "latin1", "UTF-8",sub='')
facile

вместо их удаления вы можете попытаться преобразовать их в строку UTF-8 с помощью 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")
}

вы можете заменить latin1 более подходящим enconding в вашем случае. Поскольку мы не имеем доступа к вашим данным трудно понять, какой из них будет более подходящей.


другой подход для удаления плохих символов с помощью dplyr для всего набора данных:

library(dplyr)

MyDate %>%
    mutate_at(vars(MyTextVar1, MyTextVar2), function(x){gsub('[^ -~]', '', x)})

здесь MyData и MyTextVar - это набор данных и текстовые переменные для удаления плохих яблок. Это может быть менее надежным, чем изменение кодировки, но часто это нормально и проще просто удалить их.