Как преобразовать xml_node во фрейм данных в R (с несколькими пространствами имен)? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть огромный XML-файл (> 100 МБ), который мне нужно преобразовать во фрейм данных и выполнить визуализацию данных.Я попробовал следующий код, чтобы получить узлы, дочерние элементы и имена столбцов, которые я хочу для моего конечного кадра данных:

# Sample XML Data
<feed base="https://someurl" xmlns:a="someurl" xmlns:d="someurl" xmlns="http://www.w3.org/2005/Atom">
 <title type="text">Some Title</title>
  <id>someurl...</id>
  <author><name/></author>
  <link rel="self" title="sometitle" href="somelink"/>
  <entry>
   <id>someurl</id>
   <title type="text" />
   <author><name/></author>
   <link rel="self" title="title" href="someurl">
   <category term="sometype" scheme="someurl">
   <content type="application/xml">
     <a:something>
       <d:RAW_ID m:type="Edm.String">123456</d:RAW_ID>
       <d:EMPLOYEE_ID m:type="Edm.Int">1234</d:EMPLOYEE_ID>
       <d:IN_TIME m:type="Edm.String">2018-10-21 03:45:00.0000000</d:IN_TIME>
       <d:OUT_TIME m:type="Edm.String">2018-10-21 03:46:00.0000000</d:OUT_TIME>
       ...
       ...
       ...
     </a:something>
   </content>
 </entry>
 <entry>
   ....data repeats...
 </entry>
 ...

А вот мой код R:

library(httr)
library(xml2)
library(tidyverse)

# Get xml data
response <- GET("someURL", authenticate("username", "password")

# Read xml
doc <- read_xml(response)

# Get all the relevant nodes
recs <- xml_find_all(x, "//a:something")
child <- xml_children(recs)

recs and child looks like the following respectively:

recs
{xml_nodeset (1234)}
[1] <a:something>\n  <d:RAW_ID m:type="Edm.String">123456</d:RAW_ID>\n  <d:USER_ID m:type="Edm.I ...
[2] <a:something>\n  <d:RAW_ID m:type="Edm.String">234567</d:RAW_ID>\n  <d:USER_ID m:type="Edm.I ...
[3] <a:something>\n  <d:RAW_ID m:type="Edm.String">345678</d:RAW_ID>\n  <d:USER_ID m:type="Edm.I ...
[4] ...
[5] ...

{xml_nodeset (123456)}

 [1] <d:RAW_ID m:type="Edm.String">123456</d:RAW_ID>
 [2] <d:USER_ID m:type="Edm.Int32">1234</d:USER_ID>
 [3] <d:IN_TIME m:type="Edm.String">2018-10-21 03:45:00.0000000</d:IN_TIME>
 [4] <d:OUT_TIME m:type="Edm.String">2018-10-21 03:46:00.0000000</d:OUT_TIME>
 [5] <d:DATE m:type="Edm.String">2018-10-21</d:DATE>
 [6] ...
 [7] ...
 [8] ...

Однако,Я не уверен, как мне преобразовать xml_nodeset в фрейм данных.Может кто-нибудь, пожалуйста, скажите мне, как я могу получить окончательный фрейм данных, который выглядит следующим образом:

RAW_ID   USER_ID  IN_TIME                      OUT_TIME          DATE  ...
123456   1234     2018-10-21 03:45:00.0000000  03:46:00.0000000  2018-10-21
234567   2345     2018-10-21 04:46:00.0000000  04:46:00.0000000  2018-10-21
345678   4567     2018-10-21 05:47:00.0000000  04:46:00.0000000  2018-10-21

Кроме того, поскольку XML-файл огромен, есть ли лучший способ для меня ускорить GET-запрос, такойчто для запуска моего приложения Shiny требуется больше времени?Мне нужно выполнить очистку данных, а затем передать их в ggplot для визуализации.Однако нет смысла выполнять очистку данных каждый раз при запуске приложения Shiny.

Какие-либо советы / предложения о том, как я могу сделать этот процесс более эффективным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...