当我尝试从无法更改的文件(至少不是手动 - 太大)的字符向量上运行tolower()
时,这是我收到的错误。
Error in tolower(m) : invalid multibyte string X
似乎法国公司名称是É
字符的问题。虽然我没有调查所有这些(也不可能手动这样做)。
这很奇怪,因为我的想法是在read.csv()
期间而不是在事后的操作期间识别出编码问题。
有没有快速删除这些多字节字符串的方法?或者,也许是一种识别和转换的方法?或者甚至完全忽略它们?
答案 0 :(得分:19)
以下是我解决问题的方法:
首先,我在texteditor(在本例中为Geany)中打开原始数据,单击属性并识别编码类型。
之后我使用了iconv()
函数。
x <- iconv(x,"WINDOWS-1252","UTF-8")
更具体地说,我是从导入的CSV中为data.frame
的每一列执行此操作。需要注意的是,我在stringsAsFactors=FALSE
电话中设置了read.csv()
。
dat[,sapply(dat,is.character)] <- sapply(
dat[,sapply(dat,is.character)],
iconv,"WINDOWS-1252","UTF-8")
答案 1 :(得分:4)
我知道这已经得到了解答,但我认为我会分享我的解决方案,因为我经历了同样的事情。
就我而言,我使用了包str_trim()
中的函数stringr
来修剪字符串开头和结尾的空格。
com$uppervar<-toupper(str_trim(com$var))
答案 2 :(得分:4)
我遇到了同样的问题,并且找到了一个更简单的解决方案(至少对于我的情况而言),并希望分享。
我只是添加了以下编码,它就起作用了。
read.csv(<path>, encoding = "UTF-8")
答案 3 :(得分:1)
library(tidyverse)
data_clean = data %>%
mutate(new_lowercase_col = tolower(enc2utf8(as.character(my_old_column))))
new_lowercase_col
是我根据旧的大写字母创建的新列的名称,其名称为my_old_column
。
答案 4 :(得分: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
)
答案 5 :(得分: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))