在一个数据帧上应用一个函数并返回多个数据帧

时间:2019-03-07 04:34:12

标签: r xml purrr

我有一个数据表,其中的一列包含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)

0 个答案:

没有答案