17

这是我尝试在tolower()无法更改的文件中运行字符向量时收到的错误(至少,不是手动 - 太大)。

Error in tolower(m) : invalid multibyte string X

É字符的问题似乎是法国公司名称。尽管我还没有调查所有这些(也无法手动进行)。

这很奇怪,因为我的想法是编码问题会在 期间read.csv()而不是在事后的操作期间被发现。

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

4

6 回答 6

23

这是我解决问题的方法:

首先,我在文本编辑器(本例中为 Geany)中打开原始数据,单击属性并确定编码类型。

之后我使用了该iconv()功能。

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

更具体地说,我data.frame对导入的 CSV 中的每一列都执行了此操作。重要的是要注意我在电话中设置stringsAsFactors=FALSEread.csv()

dat[,sapply(dat,is.character)] <- sapply(
    dat[,sapply(dat,is.character)],
    iconv,"WINDOWS-1252","UTF-8")
于 2012-11-02T03:50:44.813 回答
8

我遇到了同样的错误。但是,就我而言,不是在我读取文件时,而是在处理文件时稍晚一些。我意识到我遇到了错误,因为首先没有使用正确的编码读取文件。

我找到了一个更简单的解决方案(至少对我而言)并想分享。我只是添加了如下编码并且它起作用了。

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

于 2019-01-18T15:49:21.197 回答
4

我知道这已经得到了回答,但我想我会分享我的解决方案,因为我经历了同样的事情。

就我而言,我使用str_trim()包中的函数stringr来修剪字符串开头和结尾的空格。

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

于 2014-07-22T19:26:44.757 回答
3
library(tidyverse)

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

new_lowercase_col我用旧的大写字母命名的新列的名称在哪里,称为my_old_column.

于 2020-06-24T14:46:15.810 回答
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
)
于 2019-06-08T19:48:50.840 回答
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))
于 2020-01-26T06:41:39.850 回答