用不同的编码读取Rdata文件

时间:2015-12-01 16:02:32

标签: r linux encoding utf-8 rdata

我有一个.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环境中打开时损坏的重音的文本变量。

4 个答案:

答案 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)