我有一个如下所示的数据帧df:
CODE GROUP SET
1 100 6000 20
2 100 7000 30
3 200 8000 40
如何根据以下示例管道分离并包装数据框行?
<rows>
<row>100|6000|20</row>
<row>100|7000|30</row>
<row>200|8000|40</row>
<rows>
答案 0 :(得分:3)
您可以使用xmlOutputDOM
功能。它使用各种方法创建一个对象来创建XML:
myDF <- read.table(text = " CODE GROUP SET
1 100 6000 20
2 100 7000 30
3 200 8000 40", header = TRUE)
library(XML)
con <- xmlOutputDOM(tag="rows")
apply(myDF, 1, function(x){
con$addTag("row", paste(x, collapse = "|"))
})
> (myXML <- con$value())
<rows>
<row>100|6000|20</row>
<row>100|7000|30</row>
<row>200|8000|40</row>
</rows>
要将创建的XML输出为字符,您可以使用saveXML
:
> cat(saveXML(myXML))
<?xml version="1.0"?>
<rows>
<row>100|6000|20</row>
<row>100|7000|30</row>
<row>200|8000|40</row>
</rows>
答案 1 :(得分:3)
您可以使用包xmlNode
XML
library(XML)
vals <- do.call(paste, c(myDF, sep = "|"))
node <- xmlNode("rows", .children = lapply(vals, xmlNode, name = "row"))
这将生成以下XML节点
<rows>
<row>100|6000|20</row>
<row>100|7000|30</row>
<row>200|8000|40</row>
</rows>
class(node)
# [1] "XMLNode" "RXMLAbstractNode" "XMLAbstractNode"
其中myDF
是@ jdharrison回答的数据。
答案 2 :(得分:2)
不花哨,但是:
sprintf("<rows>\n%s\n</rows>\n", paste(apply(dat, 1, function(x) {
paste("<row>", paste(x, collapse="|"), "</row>", sep="")
}), collapse="\n"))
## [1] "<rows>\n<row>100|6000|20</row>\n<row>100|7000|30</row>\n<row>200|8000|40</row></rows>\n"
使用writeLines
将其保存到文件中,您会看到:
<rows>
<row>100|6000|20</row>
<row>100|7000|30</row>
<row>200|8000|40</row>
</rows>