Применить функцию к фрейму данных и вернуть несколько фреймов данных - PullRequest
0 голосов
/ 07 марта 2019

У меня есть таблица данных со столбцом, содержащим строки в формате XML, такие как:

   str = '<root>
          <MatchData id="1234" >
             <PA>
                <Name val="John, Joseph, Smith" />
                <Address value="123 Smith St City" />
                <Gender value="M" />
             </PA>
          </MatchData>
          <MatchData id="1235">
             <PA>
                <Name val="Sarah, Amy, Jones" />
                <Address value="123 Jones St City" />
                <Gender value="F" />
             </PA>
          </MatchData>
       </root>'

Для каждой строки в таблице данных мне нужно извлечь значения в новую таблицу данных, исвяжите их вместе.В настоящее время я могу сделать это с помощью цикла for, как показано ниже, где я извлекаю точный узел в строку таблицы данных, а затем добавляю к полному набору:

library(data.table)
library(xml2)
library(purrr)

Data <- data.table(String = str)
All <- data.table(ID = '', Name = '', Address = '', Gender = '')

for (i in 1:nrow(Data)){

  tryCatch( { temp <- xml_find_all(read_xml(Data$String[i]), ".//MatchData") %>% 
    map_df(function(x) {
      list(
        ID=xml_attr(x, "id"),
        Name=xml_find_first(x, ".//Name")  %>% xml_attr("val"),
        Address=xml_find_first(x, ".//Address")  %>% xml_attr("value"),
        Gender=xml_find_first(x, ".//Gender")  %>% xml_attr("value")
      )
    }) %>% as.data.table() 
  }, silent = TRUE
  , error = function(e) {})


  All <- rbind(All,temp)

}

Можно ли это сделать в функции дляускорить процесс?Я пытался, однако, таблица выходных данных не совсем верно:

parseXMLStructure <- function(y){

   return <- xml_find_all(read_xml(y), ".//MatchData") %>% 
    map_df(function(x) {
      list(
         ID=xml_attr(x, "id"),
        Name=xml_find_first(x, ".//Name")  %>% xml_attr("val"),
        Address=xml_find_first(x, ".//Address")  %>% xml_attr("value"),
        Gender=xml_find_first(x, ".//Gender")  %>% xml_attr("value")
      )
    }) %>% as.data.table() 

}
x <- mapply(parseXMLStructure,Data$String)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...