Конвертировать XML в Data Frame в R - PullRequest
0 голосов
/ 23 января 2019

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

RecordID 23063 содержит следующие данные с ActivityCreatedDate, ExpectedInstallDate, InvoiceTxnDate.Однако некоторые из следующих узлов не имеют всех этих элементов.В идентификаторе записи 23321 отсутствует InvoiceTxnDate и т. Д.

<?xml version="1.0" encoding="windows-1252" ?>
  <Record>
    <RecordID>23063</RecordID>
    <ActivityCreatedDate>2018-12-11T19:00:00</ActivityCreatedDate>
    <ExpectedInstallDate>2018-12-19T19:00:00</ExpectedInstallDate>
    <InvoiceTxnDate>2018-12-13T19:00:00</InvoiceTxnDate>
  </Record>
  <Record>
    <RecordID>23321</RecordID>
    <ActivityCreatedDate>2018-10-15T18:00:00</ActivityCreatedDate>
    <ExpectedInstallDate>2018-11-14T19:00:00</ExpectedInstallDate>
  </Record>
  <Record>
    <RecordID>23566</RecordID>
    <ActivityCreatedDate>2019-01-23T19:00:00</ActivityCreatedDate>
  </Record>
  <Record>
    <RecordID>23217</RecordID>
    <ActivityCreatedDate>2018-12-20T19:00:00</ActivityCreatedDate>
    <ExpectedInstallDate>2019-01-23T19:00:00</ExpectedInstallDate>
    <InvoiceTxnDate>2019-01-18T19:00:00</InvoiceTxnDate>
  </Record>
  <Record>
    <RecordID>23325</RecordID>
    <ActivityCreatedDate>2018-05-25T18:00:00</ActivityCreatedDate>
    <ExpectedInstallDate>2019-01-23T19:00:00</ExpectedInstallDate>
  </Record>
</end of file>

В настоящее время я использую xml2.Я использую read_xml, чтобы прочитать его в переменную, а затем xml_find_all и trimws, чтобы сохранить столбец в список.Затем я пытаюсь превратить мой список во фрейм данных, но это не удается, потому что измерения отключены.

Я хочу знать, как я могу превратить вышеуказанный XML в фрейм данных, который выглядит следующим образом:

RecordID	ActivityCreatedDate	ExpectedInstallDate	InvoiceTxnDate
1	23063	2018-12-11T19:00:00	2018-12-19T19:00:00	2018-12-13T19:00:00
2	23321	2018-10-15T18:00:00	2018-11-14T19:00:00	NA
3	23566	2019-01-23T19:00:00	NA	                NA
4	23217	2018-12-20T19:00:00	2019-01-23T19:00:00	2019-01-18T19:00:00
5	23325	2018-05-25T18:00:00	2019-01-23T19:00:00	NA

В этом случае есть способ перебрать каждый RecordID и добавить

<InvoiceTxnDate>NA</InvoiceTxnDate> or a <ExpectedInstallDate>NA</ExpectedInstallDate>

на узел, если он отсутствует?Я был бы более рад поделиться R-кодом, который у меня есть, для данных, которые все единообразны.Также, если этот вопрос не имеет смысла, пожалуйста, дайте мне знать, и я объясню больше.

Спасибо

1 Ответ

0 голосов
/ 23 января 2019

Вы пробовали использовать пакет XML?

XML::xmlToDataFrame('path to xml file')


> XML::xmlToDataFrame('~/R/test.xml')
  RecordID ActivityCreatedDate ExpectedInstallDate      InvoiceTxnDate
1    23063 2018-12-11T19:00:00 2018-12-19T19:00:00 2018-12-13T19:00:00
2    23321 2018-10-15T18:00:00 2018-11-14T19:00:00                <NA>
3    23566 2019-01-23T19:00:00                <NA>                <NA>
4    23217 2018-12-20T19:00:00 2019-01-23T19:00:00 2019-01-18T19:00:00
5    23325 2018-05-25T18:00:00 2019-01-23T19:00:00                <NA>

В случае, если XML точно такой, как показано выше, без корневого узла. Вы можете сделать следующее:

library(xml2)
library(rvest)
library(tidyverse)

## METHOD 1
## add missing root node
read_html('~/R/test.xml') %>% html_children() %>% 
  as_xml_document(root = 'doc') %>% xml_contents() %>% xml_contents() %>% 
  map_df(., function(x) {
    kids <- xml_children(x)
    setNames(as.list(type.convert(xml_text(kids))), xml_name(kids))
  })

## METHOD 2
## treating the xml as a list
read_html('~/R/test.xml') %>% 
  html_nodes('record') %>% 
  as_list() %>% 
  lapply(., function(x) unlist(x, recursive = F) %>% bind_cols()) %>% 
  bind_rows()


## both of the above methods will return the following tibble
# A tibble: 5 x 4
  recordid activitycreateddate expectedinstalldate invoicetxndate     
  <chr>    <chr>               <chr>               <chr>              
1 23063    2018-12-11T19:00:00 2018-12-19T19:00:00 2018-12-13T19:00:00
2 23321    2018-10-15T18:00:00 2018-11-14T19:00:00 NA                 
3 23566    2019-01-23T19:00:00 NA                  NA                 
4 23217    2018-12-20T19:00:00 2019-01-23T19:00:00 2019-01-18T19:00:00
5 23325    2018-05-25T18:00:00 2019-01-23T19:00:00 NA  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...