2016-11-17 10 views
0

복잡한 XML 파일을 데이터 프레임으로 변환합니다. 이 방법R 복잡한 xml을 데이터 프레임으로 변환

두 가지 문제 :

가 null이 있어야 할 곳에 두의 모든 복제
  1. 노드 중 하나에서 더 많은 데이터 포인트가있는 경우 때때로이 오류를 얻을 : "인수가 서로 다른 의미를 행 수 : 198, 240 ", 같은 행에 다시 매핑해야하며 존재하지 않으면 null이어야합니다.
  2. 어떻게 기존의 두 열을 3으로 계산합니까?

이 단순화 된 그 버전 : 실제 검색 노력이 prbly 않을 것을 내가 코멘트를 쓴 후

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

및 리턴 된 각 노드를 개별적으로 처리하십시오. 이렇게하는 법에 대한 예가 있습니다. – hrbrmstr

답변

2

내가 실현 : 당신은`line`을 대상으로해야

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

화려한 찬스! –

관련 문제