Преобразование кадра данных в XML

Я пытаюсь преобразовать фрейм данных в xml. Это около 600 тыс. записей. Я использую пакет XML:

library(XML)

con <- xmlOutputDOM("mydata")
for(i in seq(nrow(mydata))){
  con$addTag("person", attrs = mydata[i,])
}

Приведенный выше код выполняется слишком долго. Можно ли переписать этот код или использовать другой пакет для повышения производительности?


person capiono    schedule 12.12.2019    source источник


Ответы (2)


Вместо использования цикла попробуйте lapply. Может быть, это решит.

person Rafael Neves    schedule 12.12.2019

library('XML')

данные

df1 <- data.frame(a = 1:7, b = letters[1:7], stringsAsFactors = FALSE)

код

# create a new xml doc
doc_xml <- newXMLDoc(isHTML = FALSE)

# create a table node
table_node <- newXMLNode("table", doc = doc_xml)

# row data
row_data <- apply(df1, 1, function(x) {
  z1 <- newXMLNode('row') # create a new node for each row
  addChildren(z1, lapply(names(x), function(y) newXMLNode(y, x[y])))
})

# add row data to table node
xmlParent(row_data) <- table_node

# save as xml file
saveXML(doc_xml, file = "df1.xml")

Вывод

doc_xml
# <?xml version="1.0"?>
# <table>
#   <row>
#     <a>1</a>
#     <b>a</b>
#   </row>
#   <row>
#     <a>2</a>
#     <b>b</b>
#   </row>
#   <row>
#     <a>3</a>
#     <b>c</b>
#   </row>
#   <row>
#     <a>4</a>
#     <b>d</b>
#   </row>
#   <row>
#     <a>5</a>
#     <b>e</b>
#   </row>
#   <row>
#     <a>6</a>
#     <b>f</b>
#   </row>
#   <row>
#     <a>7</a>
#     <b>g</b>
#   </row>
# </table>

проверить узлы

getNodeSet(doc_xml, "//a")
getNodeSet(doc_xml, "//b")

Преобразовать xml в фрейм данных

# using xpath expression of xml data inside R
xmlToDataFrame(nodes = getNodeSet(doc_xml, "//table/*"),
               stringsAsFactors = FALSE,
               colClasses = c('integer', 'character'))
# using name of xml data inside R
xmlToDataFrame(doc = doc_xml, 
               stringsAsFactors = FALSE, 
               colClasses = c('integer', 'character'))
# from xml file
xmlToDataFrame(doc = "df1.xml", 
               stringsAsFactors = FALSE, 
               colClasses = c('integer', 'character'))
#   a b
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e
# 6 6 f
# 7 7 g
person Sathish    schedule 12.12.2019