СПИСОК к data.frame в файле XML - PullRequest
0 голосов
/ 13 февраля 2020

Я работаю с файлами XML и пытаюсь преобразовать их в data.frame. Однако в процессе преобразования файл имеет вид “LIST”, как показано ниже:

Мой код:

require(tidyverse)
require(xml2)
page<-read_xml('<?xml version="1.0" encoding="ISO-8859-1" ?>
<test2:TASS xmlns="http://www.vvv.com/schemas"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi:schemaLocation="http://www.vvv.com/schemas http://www.vvv.com/schemas/testV2_02_03.xsd"  
xmlns:test2="http://www.vvv.com/schemas" >
                <test2:billing>
                    <test2:proceduresummary>
                        <test2:guidenumber>Z4088</test2:guidenumber>
                            <test2:diagnosis>
                                <test2:table>ICD-10</test2:table>
                                <test2:diagnosiscod>G93</test2:diagnosiscod>
                                <test2:description>DISORDER OF BRAIN, UNSPECIFIED</test2:description>
                            </test2:diagnosis>
                            <test2:procedure>
                                <test2:procedure>
                                    <test2:description>HOSPITAL</test2:description>
                                </test2:procedure>
                                <test2:amount>15</test2:amount>
                            </test2:procedure>
                    </test2:proceduresummary>
                </test2:billing>
</test2:TASS>')


t1<-if ("test2" %in%  names(xml_ns(page))) {
  ns<-xml_ns_rename(xml_ns(page), test2 = "test")
} else {
  ns<- xml_ns(page)
}


MYFILE<- ifelse(names(xml_ns(page)) %in% "d1",
            page %>% xml_find_all(".//d1:billing"),
            page %>% xml_find_all(".//test:billing", ns))


MYFILE<-xml2::as_list(MYFILE) %>% jsonlite::toJSON() %>% jsonlite::fromJSON()

Мой "СПИСОК"

**List of 1
 $ :List of 2
  ..$ node:<externalptr> 
  ..$ doc :<externalptr> 
  ..- attr(*, "class")= chr "xml_node"**

I ' Я использую приведенный ниже код для его преобразования, но выдает ошибку:

MYFILE <- xml2 :: as_list (MYFILE)%>% jsonlite :: toJSON ()%>% jsonlite :: fromJSON ()

Это ошибка.

Error in UseMethod("as_list") : 
  no applicable method for 'as_list' applied to an object of class "list"

Как превратить его в data.frame / tibble?

1 Ответ

1 голос
/ 13 февраля 2020

Похоже, что оператор ifelse вызывает синтаксический анализ файла три раза. Это вызывает проблему. Если вам нужна эта строка, попробуйте вместо этого ifelse("d1" %in% names(xml_ns(page)), . . .

Этот скрипт работает на примере выше. Если существует более одного биллингового узла, то часть скрипта, приведенного ниже, нуждается в модификации. Я подчеркнул это в комментариях.

t1<-if ("test2" %in%  names(xml_ns(page))) {
  ns<-xml_ns_rename(xml_ns(page), test2 = "test")
} else {
  ns<- xml_ns(page)
}

MYFILE<- ifelse(names(xml_ns(page)) %in% "d1",
            page %>% xml_find_all(".//d1:billing"),
            page %>% xml_find_all(".//test:billing", ns))

#To prevent repeating reading the file multiple times
# MYFILE<- if ("d1" %in% names(xml_ns(page))) {
# page %>% xml_find_all(".//d1:billing")
# } else { 
# page %>% xml_find_all(".//test:billing", ns)
# }

OUTPUT<-lapply(MYFILE, function(MYFILE){
 #convert all of the nodes to named vector
 output<-as_list(MYFILE)  %>% unlist()

 #Shorten the names
 names(output) <-  gsub("^(.+?\\.)", "", names(output))

 #depending on your next steps will determine the disired output
 #create a long format dataframe
# long_answer<-data.frame(Name=names(output), output, row.names = NULL)

 #create a wide format dataframe
 wide_answer<-data.frame( t(output))
})

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