这不是我想要的:How to parse XML to R data frame
我不太了解xml,并且有一个xml文件,如下所示:
Userform_Initialize
我想从中解析“ STATISTICS_MEAN”的值,然后将其转换为R中的data.table或data.frame。
我看到了一些例子,但实际上并没有真正为此目的如何做。我想对上面的439个文件执行此操作。[从File1到File439,每个文件都具有相同的属性]因此,如果您帮助我进行循环,我会很受宠若惊。
答案 0 :(得分:1)
library(data.table)
as.data.table(xmlToDataFrame(xml("file1.xml")))
# MDI NA NA NA NA
#1: 0.43242582678795 0.11312322099674 -0.019055815413594 0.054616362290023 61.25
您可以编写一个简单的包装程序,然后使用lapply
,rbindlist
和setnames
加载所有文件并进行清理。
loadXML <- function(x) as.data.table(xmlToDataFrame(xml(x)))
fls <- rep("test.xml", 10)
datLst <- lapply(fls, loadXML)
dat <- rbindlist(datLst)
setnames(dat, c("maximum", "mean", "minimum", "sd", "vald_perc"))
dat[ , lapply(.SD, type.convert)]
# maximum mean minimum sd vald_perc
# 1: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 2: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 3: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 4: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 5: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 6: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 7: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 8: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 9: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
# 10: 0.4324258 0.1131232 -0.01905582 0.05461636 61.25
答案 1 :(得分:1)
请考虑将xmlDataFrame
与内部方法xmlAttrsToDataFrame
(需要三分冒号运算符)结合使用,以为每个 MDI 节点返回属性值和文本值:>
library(XML)
doc <- xmlParse('/path/to/input.xml')
xmldataframe <- cbind(xmlToDataFrame(nodes=getNodeSet(doc, "//MDI")),
XML:::xmlAttrsToDataFrame(getNodeSet(doc, "//MDI")))
xmldataframe
# text key
# 1 0.43242582678795 STATISTICS_MAXIMUM
# 2 0.11312322099674 STATISTICS_MEAN
# 3 -0.019055815413594 STATISTICS_MINIMUM
# 4 0.054616362290023 STATISTICS_STDDEV
# 5 61.25 STATISTICS_VALID_PERCENT
对于要遍历许多XML文件的循环,请在上面封装一个接收文件路径的函数:
proc_xml <- function(f) {
doc <- xmlParse(f)
xmldataframe <- transform(cbind(xmlToDataFrame(nodes=getNodeSet(doc, "//MDI")),
XML:::xmlAttrsToDataFrame(getNodeSet(doc, "//MDI"))),
file = f)
return(xmldataframe)
}
xml_files <- list.files(path="/folder/to/xml/files", pattern=".xml")
df_list <- lapply(xml_files, proc_xml)
final_df <- do.call(rbind, df_list)