在tolower()中出现错误,无效的多字节字符串。

18

当我尝试对一个不能手动更改的(太大了)文件中的字符向量运行tolower()函数时,我收到的错误如下:

Error in tolower(m) : invalid multibyte string X

这似乎是法国公司名称中的É字符引起的问题。虽然我没有调查所有这些名称(也不可能手动执行此操作)。

这很奇怪,因为我的想法是编码问题应该在read.csv()期间被识别出来,而不是在之后的操作中发现。

有没有快速删除这些多字节字符串的方法?或者,一种方式可以识别和转换它们?甚至只是完全忽略它们吗?


2
tolower("École") 给出了 "école",这看起来是正确的(我是法国人 :-))。 - flodel
这个问题可能会有帮助:https://dev59.com/Y2445IYBdhLWcg3wLXWh - thelatemail
1
我还应该提到的是,在Windows上(或者至少在我有Windows时)我没有遇到同样的错误。 - Brandon Bertelsen
6个回答

23

这是我解决问题的方法:

首先,我在文本编辑器(在这种情况下是Geany)中打开了原始数据,点击属性并确定编码类型。

然后,我使用了iconv()函数。

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

更具体来说,我对从导入的CSV中每一列的data.frame都进行了这样的操作。需要注意的是,我在调用read.csv()时设置了stringsAsFactors=FALSE

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

4
对于像我这样懒得识别编码的人,另一个选择是 x <- enc2utf8(x) - Martin Smith
谢谢你!这帮了我很多,我之前一直在苦思冥想。 - Rana Usman

8
我遇到了同样的错误。但是在我的情况下,不是当我读取文件时出现的,而是稍后处理文件时出现的。我意识到我之所以会出现这个错误,是因为文件一开始就没有使用正确的编码方式进行读取。
我找到了一个更简单的解决方案(至少对于我的情况是如此),并想要分享。我只需添加以下编码方式即可解决问题。 read.csv(<path>, encoding = "UTF-8")

2
或者是“ISO-8859-1”或“Windows-1252”。很棒的补充,Onur! - Brandon Bertelsen

5
library(tidyverse)

data_clean = data %>%
    mutate(new_lowercase_col = tolower(enc2utf8(as.character(my_old_column))))

其中new_lowercase_col是我从原来的大写列:my_old_column中创建的新列名。


4

我知道这个问题已经有答案了,但是我想分享一下我的解决方案,因为我也遇到了同样的问题。

在我的情况下,我使用了来自stringr包的函数str_trim()来修剪字符串开头和结尾的空格。

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


0
# 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
)

0

我对这个问题的解决方案

library(dplyr) # pipes
library(stringi) # for stri_enc_isutf8

#Read in csv data
old_data<- read.csv("non_utf_data.csv", encoding = "UTF-8")

#despite specifying utf -8, the below columns are not utf8:
all(stri_enc_isutf8(old_data$problem_column))

#The below code uses regular expressions to cleanse. May need to tinker with the last 
#portion that selects the grammar to retain

utf_eight_data<- old_data %>% 
  mutate(problem_column = gsub("[^[:alnum:][:blank:]?&/\\-]", "", old_data$problem_column)) %>%
rename(solved_problem = problem_column)

#this column is now utf 8.

all(stri_enc_isutf8(utf_eight_data$solved_problem))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接