10

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

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

加载错误(“file.Rdata”,编码 =“latin1”):未使用的参数(编码 =“latin1”)

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

4

4 回答 4

7

感谢 42 的评论,我设法编写了一个函数来重新编码文件:

fix.encoding <- function(df, originalEncoding = "latin1") {
  numCols <- ncol(df)
  for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding
  return(df)
}

这里的重点是 command Encoding(df[, col]) <- "latin1",它采用数据框列col并将df其转换为 latin1 格式。不幸的是,Encoding只将列对象作为输入,所以我必须创建一个函数来扫描数据框对象的所有列并应用转换。

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

于 2015-12-02T15:27:53.717 回答
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))
}
于 2016-11-08T02:28:59.880 回答
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)
于 2016-10-21T07:38:50.983 回答
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) 
于 2020-08-27T12:52:23.570 回答