我有一个.RData文件可以在我的Linux(UTF-8)机器上读取,但我知道该文件是在Latin1中,因为我是在Windows上自己创建的。不幸的是,我无法访问原始文件或Windows机器,我需要在Linux机器上读取这些文件。
要读取Rdata文件,正常的过程是运行load("file.Rdata")
。诸如read.csv
之类的函数有一个encoding
参数可用于解决这类问题,但load
没有这样的问题。如果我尝试load("file.Rdata", encoding = latin1)
,我只会得到此(预期)错误:
加载错误(“file.Rdata”,encoding =“latin1”): unused参数(encoding =“latin1”)
我还能做什么?我的文件加载了包含在UTF-8环境中打开时损坏的重音的文本变量。
答案 0 :(得分:5)
感谢42的评论,我设法写了一个函数来重新编码文件:
fix.encoding <- function(df, originalEncoding = "latin1") {
numCols <- ncol(df)
for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding
return(df)
}
这里的主要是Encoding(df[, col]) <- "latin1"
命令,它使用数据框col
的{{1}}列,并将其转换为latin1格式。不幸的是,df
仅将列对象作为输入,因此我必须创建一个函数来扫描数据框对象的所有列并应用转换。
当然,如果您的问题仅在几个列中,那么您最好只将Encoding
应用于这些列而不是整个数据框(您可以修改上面的功能以获取列集作为输入)。此外,如果您面临反向问题,即将在Linux或Mac OS中创建的R对象读入Windows,则应使用Encoding
。
答案 1 :(得分:2)
跟进之前的答案,这是一个小的更新,使其适用于因素和dplyr的tibble。感谢您的灵感。
fix.encoding <- function(df, originalEncoding = "UTF-8") {
numCols <- ncol(df)
df <- data.frame(df)
for (col in 1:numCols)
{
if(class(df[, col]) == "character"){
Encoding(df[, col]) <- originalEncoding
}
if(class(df[, col]) == "factor"){
Encoding(levels(df[, col])) <- originalEncoding
}
}
return(as_data_frame(df))
}
答案 2 :(得分:1)
感谢您发布此内容。我冒昧地修改你的函数,以防你有一个数据框,其中一些列作为字符,一些列作为非字符。否则,会发生错误:
> fix.encoding(adress)
Error in `Encoding<-`(`*tmp*`, value = "latin1") :
a character vector argument expected
所以这是修改后的函数:
fix.encoding <- function(df, originalEncoding = "latin1") {
numCols <- ncol(df)
for (col in 1:numCols)
if(class(df[, col]) == "character"){
Encoding(df[, col]) <- originalEncoding
}
return(df)
}
但是,这不会更改“因子”列中级别名称的编码。幸运的是,我发现这会将数据框中的所有因素都改为字符(这可能不是最好的方法,但在我的情况下,这就是我需要的):
i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)
答案 3 :(得分:0)
使用dplyr的mutate_if
的另一个选项:
fix_encoding <- function(x) {
Encoding(x) <- "latin1"
return(x)
}
data <- data %>%
mutate_if(is.character,fix_encoding)
对于必须重新编码的因子变量:
fix_encoding_factor <- function(x) {
x <- as.character(x)
Encoding(x) <- "latin1"
x <- as.factor(x)
return(x)
}
data <- data %>%
mutate_if(is.factor,fix_encoding_factor)