Ошибка в 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
)