我有一个.RData文件在我的Linux(UTF-8)机器上读取,但我知道该文件是Latin1,因为我自己在Windows上创build了它们。 不幸的是,我没有访问原始文件或Windows机器,我需要阅读我的Linux机器上的这些文件。
要读取Rdata文件,正常的过程是运行load("file.Rdata")
。 像read.csv
这样的函数有一个encoding
参数,可以用来解决这类问题,但是load
没有这样的事情。 如果我尝试load("file.Rdata", encoding = latin1)
,我只是得到这个(预期)的错误:
加载错误(“file.Rdata”,encoding =“latin1”):unused argument(encoding =“latin1”)
我还可以做些什么? 我的文件加载了文本variables,其中包含在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) }
但是,这不会在“因素”列中更改关卡名称的编码。 幸运的是,我发现这将数据框中的所有因素都改为字符(这可能不是最好的方法,但在我的情况下,这就是我所需要的):
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)) }