【问题标题】:I find this error message when I'm using xml in r我在 r 中使用 xml 时发现此错误消息
【发布时间】:2014-09-07 16:06:50
【问题描述】:

您好,我正在 Rstudio 中使用 xml。目标是将 xml 转换为 r 数据框,我正在尝试使用包文件夹中名为 tites.xml 的示例数据。

tides = system.file("exampleData", "tides.xml", package = "XML")

也许我们可以看到前几列中的项目是不变的:

类似的东西

                       origin
                   NOAA/NOS/CO-OPS
                   NOAA/NOS/CO-OPS
                   NOAA/NOS/CO-OPS
                   NOAA/NOS/CO-OPS
                   NOAA/NOS/CO-OPS
                   NOAA/NOS/CO-OPS
                   NOAA/NOS/CO-OPS

因此当我使用

xmlToDataFrame(xmlRoot(tides.str))

返回错误:

Error in `[<-.data.frame`(`*tmp*`, i, names(nodes[[i]]), value = c("2010/11/13Sat06:08    AM4.74H",  : 
duplicate subscripts for columns

我知道我可以这样做:

xmlToDataFrame(nodes = xmlChildren(xmlRoot(tides.str)[["data"]]))

生成一个数据框,但它只是一个子集,我需要手动插入前几列。

所以我在想有什么办法可以通过更改 xmlToDataFrame() 函数中的一些参数并使用整个 xml 数据来消除错误吗?

提前致谢。

【问题讨论】:

    标签: xml r


    【解决方案1】:

    我不确定xmlToDataFrame 是否可行。但是你可以把所有非数据节点提取出来,自己变成一个data.frame,没有太多麻烦。

    library(XML)
    tides = system.file("exampleData","tides.xml", package="XML")
    
    tides.str<-xmlParse(tides)
    detaildf<-xmlToDataFrame(nodes = getNodeSet(tides.str, "/datainfo/data/item"))
    
    header <- getNodeSet(tides.str, "/datainfo/*[not(self::data)]")
    headerdf <- as.data.frame(as.list(setNames(xmlSApply(header, xmlValue), 
        xmlSApply(header, xmlName))))
    
    merge(headerdf, detaildf)
    

    然后在最后我们只是“合并”这两个部分以重复详细信息中每一行的标题。

    【讨论】:

    • 嗨 MrFlick 我在想这个“*”符号是什么意思?是来自其他类型的编程语言吗?
    • getNodeSet 理解 xpath 表达式。所以“*”是 xpath 表达式语法的一部分,所以它是另一种语言,是的。它基本上意味着“任何节点”。
    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2021-06-12
    相关资源
    最近更新 更多