从R列表转换为data.frame时,8个字符会丢失
我在Windows 7 64位上使用R 3.2.0和RStudio 0.98.1103。 我的电脑的Windows“区域和语言设置”是英语(美国)。
由于某些原因,当我从web上以utf-8编码读取XML文件时,以下代码将文本“Koryčanynadpřehradou”中的“c”和“r”替换为捷克文字“č”和“r”,解析将XML文件转换为列表,并将列表转换为data.frame。
library(XML)
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken="
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE))
infoList <- xmlToList(doc[[2]][[1]])
siteName <- infoList$siteName
#this still displays correctly "Koryčany nad přehradou"
print(siteName)
#make a data.frame from the list item. I suspect here is the problem.
df <- data.frame(name=siteName, id=1)
#now the Czech characters are lost. I see only "Korycany nad prehradou"
View(df)
write.csv(df,"test.csv")
#the test.csv file also contains "Korycany nad prehradou"
#instead of "Koryčany nad přehradou"
问题是什么? 如何让R使用所有utf-8特殊字符正确显示data.frame并保存.csv文件而不会丢失捷克语“č”和“ř”字符?
这不是一个完美的答案,但下面的解决方法为我解决了这个问题。 我尝试了解R或R的行为,并创建示例,以便我的R脚本在Windows和Linux平台上产生相同的结果:
(1)从Internet获取UTF-8中的XML数据
library(XML)
url <- "http://hydrodata.info/chmi-h/cuahsi_1_1.asmx/GetSiteInfoObject?site=CHMI-H:1263&authToken="
doc <- xmlRoot(xmlTreeParse(url, getDTD=FALSE, useInternalNodes = TRUE))
infoList <- xmlToList(doc[[2]][[1]])
siteName <- infoList$siteName
(2)从Internet上打印文本:编码为UTF-8,在Windows控制台中的显示在Windows上同时使用捷克语和英语语言环境:
> Sys.getlocale(category="LC_CTYPE")
[1] "English_United States.1252"
> print(siteName)
[1] "Koryčany nad přehradou"
> Encoding(siteName)
[1] "UTF-8"
>
(3)尝试创建并查看数据帧。 这有一个问题。 data.frame在RStudio视图和控制台中均显示错误:
df <- data.frame(name=siteName, id=1)
df
name id
1 Korycany nad prehradou 1
(4)尝试使用矩阵。 令人惊讶的是矩阵在R控制台中正确显示。
m <- as.matrix(df)
View(m) #this shows incorrectly in RStudio
m #however, this shows correctly in the R console.
name id
[1,] "Koryčany nad přehradou" "1"
(5)更改语言环境。 如果我在Windows上,请将locale设置为捷克语。 如果我在Unix或Mac上,请将locale设置为UTF-8。 注意:当我在RStudio中运行脚本时,会出现一些问题,显然RStudio并不总是立即对Sys.setlocale命令作出反应。
#remember the original locale.
original.locale <- Sys.getlocale(category="LC_CTYPE")
#for Windows set locale to Czech. Otherwise set locale to UTF-8
new.locale <- ifelse(.Platform$OS.type=="windows", "Czech_Czech Republic.1250", "en_US.UTF-8")
Sys.setlocale("LC_CTYPE", new.locale)
(7)将数据写入文本文件。 重要提示:请勿使用write.csv
,而应使用write.table
。 当我的locale是Czech
在我的英文版Windows,我必须使用fileEncoding="UTF-8"
在write.table
。 现在文本文件在记事本++和Excel中正确显示。
write.table(m, "test-czech-utf8.txt", sep="t", fileEncoding="UTF-8")
(8)将区域设置恢复为原始状态
Sys.setlocale("LC_CTYPE", original.locale)
(9)尝试将文本文件读回R.注意:如果我读取文件,我必须设置encoding
参数(NOT fileEncoding!)。 从文件读取的data.frame的显示仍然不正确,但是当我将data.frame
转换为matrix
,捷克UTF-8字符被保留:
data.from.file <- read.table("test-czech-utf8.txt", sep="t", encoding="UTF-8")
#the data.frame still has the display problem, "č" and "ř" get "lost"
> data.from.file
name id
1 Korycany nad prehradou 1
#see if a matrix displays correctly: YES it does!
matrix.from.file <- as.matrix(data.from.file)
> matrix.from.file
name id
1 "Koryčany nad přehradou" "1"
因此,我得到的教训是,我需要将我的data.frame
转换为matrix
,在将捷克语字符的数据写入文件之前,将我的语言环境设置为Czech
(在Windows上)或UTF-8
(在Mac和Linux上)。 然后,当我写入文件时,我必须确保fileEncoding
必须设置为UTF-8。 另一方面,当我稍后阅读文件时,我可以继续在英文语言环境中工作,但在read.table
我必须设置encoding="UTF-8"
。
如果有人有更好的解决方案,我会欢迎你的建议。
链接地址: http://www.djcxy.com/p/84763.html上一篇: 8 characters get lost when converting from list to data.frame in R
下一篇: GitHub API: Identify the branches that contain a given commit