2016-12-07 2 views
1

次のxmlファイルからsample_attributes(できればall)を解析しようとしています。物事のカップルしようとしましたが、XMLは、一つのノードに凝集します:ここで言及階層ノード、タグ、および値を持つRのxmlパーサ

xml.url <- "http://www.ebi.ac.uk/ena/data/view/ERS445758&display=xml" 
xmlfile <- xmlTreeParse(xml.url) 
xmltop = xmlRoot(xmlfile) 
IBDcat <- xmlSApply(xmltop, function(x) xmlSApply(x, xmlValue)) 

も試した解決策: How to parse XML to R data framehow to create an R data frame from a xml fileが、私はのような何かしようとすると:

data <- xmlParse("http://www.ebi.ac.uk/ena/data/view/ERS445758&display=xml") 
xml_data <- xmlToList(data) 
xmlToDataFrame(nodes=getNodeSet(data,"/SAMPLE_ATTRIBUTE"))[c("age","sex","body site","body-mass index")] 

を私はエラーを取得します定義されていない列が選択されています

ありがとうございます!

答えて

3

。タグでサブセット化します。

doc <- xmlParse(xml.url) 
x <- xmlToDataFrame(getNodeSet(doc,"//SAMPLE_ATTRIBUTE")) 
## OR 
xmlToDataFrame(doc["//SAMPLE_ATTRIBUTE"]) 
        TAG  VALUE UNITS 
1 investigation type metagenome <NA> 
2  project name  BMRP <NA> 
3 experimental factor microbiome <NA> 
4   target gene 16S rRNA <NA> 
5 target subfragment  V1V2 <NA> 
... 


subset(x, TAG %in% c("age","sex","body site","body-mass index")) 
       TAG   VALUE UNITS 
15    age   28 years 
16    sex   male <NA> 
17  body site Sigmoid colon <NA> 
19 body-mass index 16.9550173 <NA> 
3

ここには簡潔なオプションがあります。 xml2には、関数が関連付けられた単純なread_xml関数があります。 purrrは、非常に便利なリストを操作するためのパッケージですが、好きな場合はベースRでも同じことができます。

library(xml2) 
library(purrr) 

x <- read_xml("http://www.ebi.ac.uk/ena/data/view/ERS445758&display=xml") 

x_list <- as_list(x) 

x_df <- x_list %>% map('SAMPLE_ATTRIBUTES') %>% flatten() %>% map_df(flatten) 

x_df 
#> # A tibble: 35 × 3 
#>      TAG        VALUE UNITS 
#>      <chr>        <chr> <chr> 
#> 1  investigation type       metagenome <NA> 
#> 2   project name        BMRP <NA> 
#> 3  experimental factor       microbiome <NA> 
#> 4    target gene       16S rRNA <NA> 
#> 5  target subfragment        V1V2 <NA> 
#> 6    pcr primers       27F-338R <NA> 
#> 7 multiplex identifiers       TGATACGTCT <NA> 
#> 8  sequencing method      pyrosequencing <NA> 
#> 9 sequence quality check       software <NA> 
#> 10   chimera check ChimeraSlayer; Usearch 4.1 database <NA> 
#> # ... with 25 more rows 

または代わりのXPathでのサブセットを実行します。

x %>% xml_find_all('//SAMPLE_ATTRIBUTE') %>% map(as_list) %>% map_df(flatten) 

同じものを返します。 @allistaireによって非常に創造的なものに

+0

お返事ありがとうございます!私は現在、RStudioでR 3.2.2を実行しています。私はPurrをインストールしようとしましたが、このバージョンでは使用できません:/そのため、マップ関数を効果的に使用することはできません...大規模なRアップデートが必要になります。 –

+1

これは3.2.2で利用できるはずです。それが持つ最も高いRバージョン依存性は3.1.2( 'dplyr'を介して)です。 Rの最新バージョンへのアップデートは常に良いことですが、3つの "r"があることを確認してください。そのエラーは通常、パッケージ名の間違い( 'install.packages(" purrr ")'または単に 'purrr'、' xml2'などを含む 'install.packages(" tidyverse ")'を実行した結果です。パッケージ。 – alistaire

+0

3番目のr < - "" purrr "でした。 xml_find_all関数がうまく機能しました。 –

2

少し異なるアプローチ:

少なくとも2番目の試みのために、あなたはちょうど//使用して 任意の SAMPLE_ATTRIBUTEノードを選択するために必要な
library(xml2) 

doc <- read_xml("http://www.ebi.ac.uk/ena/data/view/ERS445758&display=xml") 

xml_find_all(doc, ".//SAMPLE_ATTRIBUTE") %>% 
    map(xml_children) %>% 
    map_df(~as.list(setNames(xml_text(.), xml_name(.)))) 
+0

両方のお返事ありがとう!私は現在、RStudioでR 3.2.2を実行しています。私はPurrをインストールしようとしましたが、このバージョンでは使用できません:/そのため、マップ関数を効果的に使用することはできません...大規模なRアップデートが必要になります。 –

関連する問題