Ошибка в tolower() недопустимой многобайтовой строке

Это ошибка, которую я получаю, когда пытаюсь запустить tolower() в символьном векторе из файла, который не может быть изменен (по крайней мере, не вручную - слишком большой).

Error in tolower(m) : invalid multibyte string X

Кажется, что имена французских компаний являются проблемой с символом É. Хотя я не исследовал их все (также невозможно сделать это вручную).

Странно, потому что я думал, что проблемы с кодировкой были бы идентифицированы во время read.csv(), а не во время операций после факта.

Есть ли быстрый способ удалить эти многобайтовые строки? Или, может быть, способ идентифицировать и преобразовать? Или даже просто игнорировать их полностью?

Ответ 1

Вот как я решил свою проблему:

Сначала я открыл исходные данные в текстовом редакторе (в данном случае Geany), нажал свойства и определил тип кодирования.

После этого я использовал функцию iconv().

x <- iconv(x,"WINDOWS-1252","UTF-8")

Чтобы быть более конкретным, я сделал это для каждого столбца data.frame из импортированного CSV. Важно отметить, что я установил stringsAsFactors=FALSE в мой вызов read.csv().

dat[,sapply(dat,is.character)] <- sapply(
    dat[,sapply(dat,is.character)],
    iconv,"WINDOWS-1252","UTF-8")

Ответ 2

Я знаю, что на это уже был дан ответ, но я решил поделиться своим решением с этим, поскольку я испытал то же самое.

В моем случае я использовал функцию str_trim() из пакета stringr, чтобы обрезать пробелы из начала и конца строки.

com$uppervar<-toupper(str_trim(com$var))

Ответ 3

У меня была та же проблема, и я нашел гораздо более простое решение (по крайней мере, для моего случая) и хотел поделиться.

Я просто добавил кодировку, как показано ниже, и это сработало.

read.csv(<path>, encoding = "UTF-8")

Ответ 4

# to avoid datatables warning: error in tolower(x) invalid multibyte string
# assuming all columns are char
new_data <- as.data.frame(
  lapply(old_data, enc2utf8),
  stringsAsFactors = FALSE
)