这是我尝试在tolower()
无法更改的文件中运行字符向量时收到的错误(至少,不是手动 - 太大)。
Error in tolower(m) : invalid multibyte string X
É
字符的问题似乎是法国公司名称。尽管我还没有调查所有这些(也无法手动进行)。
这很奇怪,因为我的想法是编码问题会在 期间read.csv()
而不是在事后的操作期间被发现。
有没有快速删除这些多字节字符串的方法?或者,也许是一种识别和转换的方法?或者甚至完全忽略它们?
这是我尝试在tolower()
无法更改的文件中运行字符向量时收到的错误(至少,不是手动 - 太大)。
Error in tolower(m) : invalid multibyte string X
É
字符的问题似乎是法国公司名称。尽管我还没有调查所有这些(也无法手动进行)。
这很奇怪,因为我的想法是编码问题会在 期间read.csv()
而不是在事后的操作期间被发现。
有没有快速删除这些多字节字符串的方法?或者,也许是一种识别和转换的方法?或者甚至完全忽略它们?
这是我解决问题的方法:
首先,我在文本编辑器(本例中为 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")
我遇到了同样的错误。但是,就我而言,不是在我读取文件时,而是在处理文件时稍晚一些。我意识到我遇到了错误,因为首先没有使用正确的编码读取文件。
我找到了一个更简单的解决方案(至少对我而言)并想分享。我只是添加了如下编码并且它起作用了。
read.csv(<path>, encoding = "UTF-8")
我知道这已经得到了回答,但我想我会分享我的解决方案,因为我经历了同样的事情。
就我而言,我使用str_trim()
包中的函数stringr
来修剪字符串开头和结尾的空格。
com$uppervar<-toupper(str_trim(com$var))
library(tidyverse)
data_clean = data %>%
mutate(new_lowercase_col = tolower(enc2utf8(as.character(my_old_column))))
new_lowercase_col
我用旧的大写字母命名的新列的名称在哪里,称为my_old_column
.
# 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
)
我对这个问题的解决方案
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))