读取不同编码的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)
我有一个 .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)