在 R 中从列表转换为 data.frame 时,utf-8 字符会丢失

2023-12-21

我在 Windows 7 64 位上使用 R 3.2.0 和 RStudio 0.98.1103。我的电脑的Windows“区域和语言设置”是英语(美国)。

由于某种原因,以下代码将文本“Koryčany nad přehradou”中的捷克语字符“č”和“ř”替换为“c”和“r”,当我从网络读取 utf-8 编码的 XML 文件时,解析将 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 脚本在 Windows 和 Linux 平台上产生相同的结果:

(1) 从网上获取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) 从网上打印出文本:编码为UTF-8,在Windows上使用捷克语和英语语言环境在R控制台中显示也是正确的:

> 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。这有一个问题。 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,请将区域设置设置为捷克语。如果我使用的是 Unix 或 Mac,请将区域设置设置为 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。当我的语言环境是Czech在我的英语 Windows 上,我必须使用fileEncoding="UTF-8" in the write.table。现在,文本文件可以在 notepad++ 和 Excel 中正确显示。

write.table(m, "test-czech-utf8.txt", sep="\t", fileEncoding="UTF-8")

(8) 将语言环境设置回原来的语言环境

Sys.setlocale("LC_CTYPE", original.locale)

(9) 尝试将文本文件读回 R。注意:如果我读该文件,我必须设置encoding参数(不是文件编码!)。从文件读取的 data.frame 的显示仍然不正确,但是当我转换我的data.frame to a 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 to a matrix,将我的区域设置设置为Czech(在 Windows 上)或UTF-8(在 Mac 和 Linux 上)在我将包含捷克语字符的数据写入文件之前。然后当我写入文件时,我必须确保fileEncoding必须设置为 UTF-8。另一方面,当我稍后阅读该文件时,我可以继续在英语语言环境中工作,但在read.table我必须设置encoding="UTF-8".

如果有人有更好的解决方案,我会欢迎您的建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R 中从列表转换为 data.frame 时,utf-8 字符会丢失 的相关文章

  • 使用 tidymodel 运行多个回归模型

    我最近一直在使用 tidymodels 来运行模型并选择最能满足某些目标函数的参数 例如 对 mtcars 数据使用假设回归 使用此问题底部答案中的回归示例作为示例 https stackoverflow com questions 241
  • merge.zoo 删除时区

    的结果merge zoo与其输入的时区不同 考虑下面的例子 library zoo zoo a zoo data frame a 1 5 seq as POSIXct 2014 01 01 00 00 01 tz UTC as POSIXc
  • UTF-8 解码如何知道字节边界?

    我一直在阅读大量有关 unicode 编码的文章 尤其是有关 Python 的文章 我想我现在对此已经有了相当深入的了解 但仍有一个小细节我有点不确定 解码如何知道字节边界 例如 假设我有一个带有两个 unicode 字符的 unicode
  • R data.table 按组创建列表列

    我有一个data table下面 我想将一个函数应用于列v2通过 分组v1 and order 结果列v3应该是下面的向量列表 如何编写这个函数 以便它为每个组的第一行返回一个 0 向量 order 1 v1 in c 1 2 对于组中的每
  • 检查远程错误时出错 (val):5 个节点产生错误:未找到对象

    我尝试使用并行处理 parLapply 进行 10 倍交叉验证并估计联合模型的模型性能 我试图找出为什么我收到错误消息 checkForRemoteErrors val 中的错误 五个节点产生错误 未找到对象 Week 代码如下 Valid
  • 使用条件函数在 data.table() 中分配多列

    在上一个问题中在 dplyr mutate 中返回一个列表 https stackoverflow com questions 21630406 return a list in dplyr mutate noredirect 1 comm
  • ggplot2极坐标图轴标签位置

    This is just a extension for a old question ggplot2 polar plot arrows https stackoverflow com questions 10515703 ggplot2
  • R 使用 dplyr 将列移动到最后

    对于 data frame 来说n列 我希望能够从任何列移动列1 n 1 位置 成为第 n 列 即非最后一列成为最后一列 我也想使用dplyr 我想这样做而不是简单地键入所有列的名称 例如 data lt data frame a 1 5
  • mutate rowSums 排除一列

    我有一个像这样的数据框 gt df Source local data frame 4 x 4 a x y z 1 name1 1 1 1 2 name2 1 1 1 3 name3 1 1 1 4 name4 1 1 1 想要通过添加 x
  • 条件格式 DT 中的样式

    我想根据 B 列中的值对 A 列中的行进行着色 下面的代码基于小插图中的示例Link https rstudio github io DT 010 style html 但仅显示两列的条件 mobile number by mobile f
  • 问号字符显示在文本中。为什么是这样?

    我有一个备份服务器 可以自动备份我的实时站点 包括文件和数据库 在实时站点上 文本看起来不错 但是当您查看它的镜像版本时 它会显示 在某些文本中 该文本存储在新闻数据库表中 这是实时服务器和镜像服务器上的屏幕截图 将其备份到镜像服务器的过程
  • 使用plot(...,add=T) 叠加栅格图会导致最终图任意错位

    我发现 当我尝试使用plot add T 叠加多个栅格时 如果我尝试将超过3 个栅格叠加在一起 则后续图不会正确对齐栅格 我的初衷是创建一个模拟土地覆盖的分类地图 其中代表覆盖类别的颜色深浅随着我们模型投影的确定性而变化 为此 我创建了一个
  • 如何使用 python apply/lambda/shift 函数根据 2 列的值获取该特定列的前一行值?

    我有 2 列 FN1 和 FN2 基于这些我必须再创建一列 最终 FN1 FN2 Final False False 1 True True 1 False False 1 True False 2 True True 2 False Fa
  • 传说在北卡罗来纳州地理地图上消失?

    我正在使用 R 编程语言 使用北卡罗来纳州的内置地图 我生成了 3 个随机变量 收入 孩子数量 体重 然后为此数据创建了地图 使用 传单 库 通过循环 library sf library mapview library leaflet l
  • R 中的“CSS 中的非平稳季节性 AR 部分”错误

    我正在尝试拟合季节性分解系列的 ARIMA 模型 但是当我尝试执行以下操作时 fit arima diff series order c 1 0 0 seasonal list order c 1 0 0 period NA 它给我以下错误
  • 如何在 R 中创建没有情节的图例?

    这是一个艺术项目 我创建了一个包含 5 种不同颜色的许多点的散点图 我想创建一个与绘图完全分开的图例 因为它不在绘图上 也不在绘图旁边 而是在它自己的窗口中 因此我可以将图例保存为它自己的 pdf 文件 这样我就可以将我的情节和图例分开打印
  • Pandas 将 NULL 读取为 NaN 浮点数而不是 str [重复]

    这个问题在这里已经有答案了 给定文件 cat test csv a b c NULL d e f g h i j k l m n 其中第三列被视为str 当我对列执行字符串函数时 pandas已阅读NULLstr 作为一个NaN float
  • 如何在Shiny中动态生成的条件面板中格式化条件?

    我正在尝试使用 for 循环在 Shiny 中创建小部件 每个块包含 label 复选框 选择选择器 两个数字输入 我想根据复选框的值和选择选择器的值来设置显示或隐藏两个数字输入的条件 在我创建的 for 循环中 我为每个小部件变量添加了一
  • 如何识别数据集中其他列之和的列

    我想编写一个函数 最好用 R 语言 但也欢迎其他语言 它可以识别数据集中列之间的关系 仅限于加法 减法 其实际应用是在大型多列财务数据集上运行它 其中某些列是其他列的小计 并识别此类小计 理想情况下 我希望允许一些小的差异 例如允许舍入问题
  • R 是解释型编程语言还是编译型编程语言?

    R 是解释型编程语言还是编译型编程语言 The R FAQ https cran r project org doc FAQ R FAQ html What is R 003f说 R 的核心是一种解释型计算机语言

随机推荐