读取不同编码的Rdata文件

Reading Rdata file with different encoding

我有一个 .RData 文件可以在我的 Linux (UTF-8) 机器上读取,但我知道该文件是 Latin1 格式的,因为我自己在 Windows 上创建了它们。不幸的是,我无法访问原始文件或 Windows 机器,我需要在我的 Linux 机器上阅读这些文件。

要读取一个Rdata文件,正常的步骤是运行load("file.Rdata")read.csv 等函数有一个 encoding 参数可以用来解决这类问题,但是 load 没有这样的东西。如果我尝试 load("file.Rdata", encoding = latin1),我只会得到这个(预期的)错误:

Error in load("file.Rdata", encoding = "latin1") : unused argument (encoding = "latin1")

我还能做什么?我的文件加载了包含重音的文本变量,这些变量在 UTF-8 环境中打开时会损坏。

感谢 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",它获取数据帧 df 的列 col 并将其转换为 latin1 格式。不幸的是,Encoding 仅将列对象作为输入,因此我不得不创建一个函数来扫描数据框对象的所有列并应用转换。

当然,如果您的问题只出现在几列中,您最好只将 Encoding 应用于这些列而不是整个数据框(您可以修改上面的函数以获取列集作为输入)。此外,如果您面临相反的问题,即将在 Linux 或 Mac OS 中创建的 R 对象读入 Windows,您应该使用 originalEncoding = "UTF-8"

感谢您发帖。我冒昧地修改了你的函数,以防你有一个数据框,其中一些列是字符列,一些列是非字符列。否则会报错:

> 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)
}

但是,这不会更改 "factor" 列中关卡名称的编码。幸运的是,我发现这可以将数据框中的所有因素更改为字符(这可能不是最好的方法,但在我的情况下这就是我需要的):

i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)

继之前的答案之后,这是一个小更新,它可以处理因素和 dplyr 的问题。感谢您的启发。

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))
}

另一个使用 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)