2016-11-17 111 views
0

我正在将复杂的XML文件转换为数据框。R将复杂的XML文件转换为数据框

两个问题的方法:

  1. 全部两个被复制,它应该是空
  2. 如果在节点的一个或多个数据点,那么有时会得到这个错误:“参数意味着,不同的行数:198,240“,它应该映射回同一行,如果它不存在,应该为空。
  3. 如何计算两个现有的列等于3?

这是一个简化版本:

require(xml2) 

xml_data = " 
<top> 
    <line> 
     <one>1</one> 
    </line> 
    <line> 
     <one>1</one> 
     <two>2</two> 
    </line> 
    <line> 
     <one>1</one> 
    </line> 
</top> 
" 

data2 <- read_xml(file) 


df <- data.frame(
    #purchase 
    one=xml_text(xml_find_all(data2, ".//line/one")), 
    two=xml_text(xml_find_all(data2, ".//line/two")), 
    sum1 = one + two 
) 
+0

你有目标'line'和然后分别处理每个返回的节点。有如何做到这一点的例子。 – hrbrmstr

回答

2

后,我写的评论,我意识到,实际搜索的努力是不可能prbly:

require(xml2) 
library(purrr) 
library(dplyr) 

xml_data = " 
<top> 
    <line> 
     <one>1</one> 
    </line> 
    <line> 
     <one>1</one> 
     <two>2</two> 
    </line> 
    <line> 
     <one>1</one> 
    </line> 
</top> 
" 

data2 <- read_xml(xml_data) 

xml_find_all(data2, ".//line") %>% 
    map_df(function(x) { 
    one <- xml_find_all(x, ".//one") %>% xml_text() %>% as.numeric() 
    two <- xml_find_all(x, ".//two") %>% xml_text() %>% as.numeric() 
    if (length(two) == 0) two <- NA_integer_ 
    data_frame(one, two, sum=sum(one, two, na.rm=TRUE)) 
    }) 
## # A tibble: 3 × 3 
##  one two sum 
## <dbl> <dbl> <dbl> 
## 1  1 NA  1 
## 2  1  2  3 
## 3  1 NA  1 
+0

非常感谢你! –