2017-06-20 9 views
1

Rを使用して特定のXMLノードから情報を抽出したいと思っています:http://www.uniprot.org/uniprot/P38949.xml。それは、次のブロックに関する:私は次のコードを使用して機能タイプ=「配列変異体」ノードを展開しようとしxml parse uniprot features

<feature type="initiator methionine" description="Removed" evidence="1"> 
<location> 
    <position position="1"/> 
</location> 
    </feature> 
    <feature type="chain" description="Major pollen allergen Car b 1 isoforms 1A and 1B" id="PRO_0000154185"> 
<location> 
    <begin position="2"/> 
    <end position="160"/> 
</location> 
    </feature> 
    <feature type="sequence variant" description="In isoform 1B."> 
<original>V</original> 
<variation>A</variation> 
<location> 
    <position position="38"/> 
</location> 
    </feature> 
    <feature type="sequence variant" description="In isoform 1B."> 
<original>I</original> 
<variation>S</variation> 
<location> 
    <position position="63"/> 
</location> 
    </feature> 
    <feature type="sequence variant" description="In isoform 1B."> 
<original>K</original> 
<variation>E</variation> 
<location> 
    <position position="133"/> 
</location> 
    </feature> 

TabName = "P38949" 
    http = paste0("http://www.uniprot.org/uniprot/",TabName,".xml") 
    data = xmlParse(http) 
    nd = getNodeSet(data, "//ns:entry", namespaces=c(ns=getDefaultNamespace(data)[[1]]$uri)) 

    original = sapply(nd, xpathSApply, './/*[local-name()="original"]', xmlValue) 
    variation = sapply(nd, xpathSApply, './/*[local-name()="variation"]', xmlValue) 
    description = sapply(nd, xpathSApply, './/*[local-name()="feature" and @type="sequence variant"]', xmlGetAttr, 'description') 

    position = sapply(nd, xpathSApply, './/*[local-name()="position"]', xmlGetAttr, 'position') 

    table = rbind(table, data.frame(description,original,variation,position)) 

私が正しく属性の位置を抽出することができないのですが、このスクリプトは、フィーチャタイプ= "イニシエータメチオニン"の位置属性も抽出しているので、これは必要ではありません。出力テーブルには、次のようになります。

 description original variation position 
    In isoform 1B.  V   A  38 
    In isoform 1B.  I   S  63 
    In isoform 1B.  K   E  133 

答えて

0

rvest(少しより便利xml2「バージョン」)とpurrrの使用:

library(rvest) 
library(purrr) 

read_xml('http://www.uniprot.org/uniprot/P38949.xml') %>% 
    xml_nodes(xpath = '//d1:feature[@type="sequence variant"]') %>% 
    map_df(~{ 

     description <- xml_attr(.x, 'description') 

     original <- xml_node(.x, xpath = 'd1:original') %>% 
          xml_text() 

     variation <- xml_node(.x, xpath = 'd1:variation') %>% 
          xml_text() 

     position <- xml_node(.x, xpath = 'd1:location/d1:position') %>% 
          xml_attr('position') 

     data.frame(description, original, variation, position, 
        stringsAsFactors = FALSE) 
    }) 
#>  description original variation position 
#> 1 In isoform 1B.  V   A  38 
#> 2 In isoform 1B.  I   S  63 
#> 3 In isoform 1B.  K   E  133 
0

あなたはまた、配列変異体ノードを得ることができ、flattenxmlToList出力それを表に結びつけます。

library(purrr) 
library(dplyr) 

variants <- getNodeSet(data, "//ns:feature[@type='sequence variant']", "ns") 
bind_rows(lapply(variants, function(x) flatten(xmlToList(x))))[, c(5,1:3)] 
# A tibble: 3 x 4 
     description original variation position 
      <chr> <chr>  <chr> <chr> 
1 In isoform 1B.  V   A  38 
2 In isoform 1B.  I   S  63 
3 In isoform 1B.  K   E  133