【发布时间】:2017-01-29 08:25:32
【问题描述】:
对于 tl;dr,我在底部有一个简单的问题:
我正在尝试将 XML 文件转换为 R 中可用的表。
<toes copyright='(C)version='1.1'> <generated date='2017-01-21
07:45:04'timestamp='1485006304'/>
<description> Active TOE vehicle levels and adjustments for the current
campaign up to the RDP cycle in progress. c0 = the cycle 0 capacity, adj
= comma-separated list of cycle:capacity adjustments, cur = current
capacity </description>
<defaults><def att='adj' value=''/></defaults>
<r toe="deairfor" veh="22" c0="30" cur="30"/>
<r toe="deairfor" veh="23" c0="40" cur="20" adj="1:35,2:20"/>
<r toe="deairfor" veh="26" c0="2" cur="2" adj="2:10,3:30"/>
</toes>
我想要的格式是这样的:
"TOE" "Veh" "c0" "cur" "adj1" "adj2" "adj3"
"deairfor" 22 30 30 NA NA NA
"deairfor" 23 40 20 35 20 NA
"deairfor" 26 2 2 NA 10 30
我对导入 XML 文件的经验为零,但我认为该文件的格式不正确,因为我没有遇到任何 XML 示例,其中包含标签内的数据,例如 .我已经能够使用以下内容提取数据:
library(XML)
source <- "http://wiretap.wwiionline.com/xml/toes.sheet.xml"
xmlfile <- xmlTreeParse(source, useInternalNodes = TRUE)
nodes <- getNodeSet(xmlfile, "/toes//r")
Df1 <- NULL
for(i in 1:length(nodes)) {
Df1 <- t(xmlToList(nodes[[i]]))
Df2 <- smartbind(Df2,Df1[1,])
}
我一次只能提取 1 行,所以我使用后面的代码将它们绑定在一起。我需要 df1/2 否则它会在 i = 1 时出错。可能以不同的方式更容易,但我无法让它工作。
这给我留下了一个数据框 Df2,所有变量都是“因子”(为什么?)
"TOE" "Veh" "c0" "cur" "adj"
deairfor 22 30 30 NA
deairfor 23 40 20 35 1:35,2:20
deairfor 26 2 2 2 2:10,3:30
所以现在的困难在于这个“adj”列。我可以将其与以下内容分开:
Df2 <- separate(data = Df2, col = adj, into = c("adj1", adj2","adj3"), sep = "\\,")
Df2 <- separate(data = Df2, col = adj1, into = c("adj1","adj1value"), sep = "\\:")
Df2 <- separate(data = Df2, col = adj2, into = c("adj2","adj2value"), sep = "\\:")
Df2 <- separate(data = Df2, col = adj3, into = c("adj3","adj3value"), sep = "\\:")
但单元格不在正确的列中。现在df2如下:
"TOE" "Veh" "c0" "cur" "adj1" "adj1value" "adj2" "adj2value" "adj3" "adj3value"
deairfor 22 30 30 NA NA NA NA NA NA
deairfor 23 40 20 1 35 2 20 NA NA
deairfor 26 2 2 2 10 3 30 NA NA
虽然最后一行需要:(一旦 adj1 值在正确的列中,我们也可以删除 adj1/adj2/adj3)
deairfor 26 2 2 NA NA 2 10 3 30
我尝试了多种方法将这些单元格向右移动,但经常出错,例如:(adj* 列是分隔后的字符,因此是“1”)
Df2$adj3[Df2$adj1 == "1"] <- Df2$adj2
Df2$adj3value[Df2$adj1 == "1"] <- Df2$adj2value
"NAs are not allowed in subscripted assignments"
所以问题:如何将这些值移动到正确的列?
"TOE" "Veh" "c0" "cur" "adj"
deairfor 26 2 2 2:10,3:30
应该变成
"TOE" "Veh" "c0" "cur" "adj1" "adj2" "adj3"
deairfor 26 2 2 NA 10 30
额外的问题:我觉得我需要使用很多行,因为一开始的 XML 导入并不是很理想,无论如何要根据我的目标做得更好?
【问题讨论】:
-
试试这篇文章使用的一些方法来从 xml 创建一个框架,看看它是否适合你。 stackoverflow.com/questions/17198658/…
-
好奇,您发布的 xml 与 url 不匹配,因为网页没有 adj 属性。
-
是的,网页会随着时间的推移而更新。很遗憾,Adj 只会在两周后再次出现。