简体   繁体   English

从R中的NCBI entrez解析xml

[英]Parsing xml from a NCBI entrez in R

I want to extract some informations from the features section of a NCBI entry and I'm using this code. 我想从NCBI条目的功能部分中提取一些信息,并且正在使用此代码。 To download the data 下载数据

fetch2 <- entrez_fetch(db = "nucleotide", id = 1028916732, 
                       rettype = "gbc", retmode="xml", parsed = TRUE)

To analyse the data 分析数据

xmltop = xmlRoot(fetch2) #gives content of root
class(xmltop)#"XMLInternalElementNode" "XMLInternalNode" "XMLAbstractNode"
xmlName(xmltop) 
xmlSize(xmltop)
xmlName(xmltop[[1]]) 
features <- xmltop[[1]][[20]][[1]][[4]]

I'm only interested in the features 我只对功能感兴趣

  <INSDFeature_quals>
      <INSDQualifier>
        <INSDQualifier_name>organism</INSDQualifier_name>
        <INSDQualifier_value>Alanphillipsia aloeigena</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>mol_type</INSDQualifier_name>
        <INSDQualifier_value>genomic DNA</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>strain</INSDQualifier_name>
        <INSDQualifier_value>CPC 21286</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>isolation_source</INSDQualifier_name>
        <INSDQualifier_value>leaves</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>host</INSDQualifier_name>
        <INSDQualifier_value>Aloe melanacantha</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>culture_collection</INSDQualifier_name>
        <INSDQualifier_value>CBS:136408</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>culture_collection</INSDQualifier_name>
        <INSDQualifier_value>CPC:21286</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>type_material</INSDQualifier_name>
        <INSDQualifier_value>culture from holotype of Alanphillipsia aloeigena</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>db_xref</INSDQualifier_name>
        <INSDQualifier_value>taxon:1414674</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>country</INSDQualifier_name>
        <INSDQualifier_value>South Africa: Namakwaland, Koegap Nature Reserve</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>collected_by</INSDQualifier_name>
        <INSDQualifier_value>M.J. Wingfield</INSDQualifier_value>
      </INSDQualifier>
      <INSDQualifier>
        <INSDQualifier_name>note</INSDQualifier_name>
        <INSDQualifier_value>ex-holotype culture of Alanphillipsia aloeigena</INSDQualifier_value>
      </INSDQualifier>
    </INSDFeature_quals> 

I would like to create a table like 我想创建一个像表

Organism | culture_collection | host  
Alanphillipsia aloeigena | CBS:136408 | Aloe melanacantha

However I don't understand how to retrieve data with 但是我不明白如何用

<INSDQualifier_name>
<INSDQualifier_value>

I have seen some tutorials from Pubmed and it works well but the outputs has a different structure. 我看过Pubmed的一些教程,效果很好,但是输出的结构不同。 In end I want to make a loop to extract data from a list of ID and since not all the entries have the same structure I would like to use the tags like host organism to retrieve that info. 最后,我想做一个循环以从ID列表中提取数据,由于并非所有条目都具有相同的结构,因此我想使用诸如host organism类的标签来检索该信息。

Since your XML is fairly flat, consider XML's convenient handler, xmlToDataFrame : 由于您的XML非常平坦,因此请考虑使用XML的便捷处理程序xmlToDataFrame

library(XML)

fetch2 <- ...
doc <- xmlParse(fetch2)
df <- xmlToDataFrame(doc, nodes=getNodeSet(doc, "//INSDQualifier"))

df
#    INSDQualifier_name                               INSDQualifier_value
# 1            organism                          Alanphillipsia aloeigena
# 2            mol_type                                       genomic DNA
# 3              strain                                         CPC 21286
# 4    isolation_source                                            leaves
# 5                host                                 Aloe melanacantha
# 6  culture_collection                                        CBS:136408
# 7  culture_collection                                         CPC:21286
# 8       type_material culture from holotype of Alanphillipsia aloeigena
# 9             db_xref                                     taxon:1414674
# 10            country  South Africa: Namakwaland, Koegap Nature Reserve
# 11       collected_by                                    M.J. Wingfield
# 12               note   ex-holotype culture of Alanphillipsia aloeigena

And then run a transpose with column and row names cleanup if each of the above rows should be columns with corresponding values 如果上面的每一行都应该是具有相应值的列,然后使用列和行名称清除运行转置

final_df <- data.frame(t(df), stringsAsFactors = FALSE)

colnames(final_df) <- as.character(final_df[1,])
final_df <- final_df[-1,]
rownames(final_df) <- NULL

final_df 
#                   organism    mol_type    strain isolation_source              host culture_collection culture_collection                                     type_material
# 1 Alanphillipsia aloeigena genomic DNA CPC 21286           leaves Aloe melanacantha         CBS:136408          CPC:21286 culture from holotype of Alanphillipsia aloeigena
#          db_xref                                          country   collected_by                                            note
#  1 taxon:1414674 South Africa: Namakwaland, Koegap Nature Reserve M.J. Wingfield ex-holotype culture of Alanphillipsia aloeigena

How to do this when fetch2 has >1 GenBank records; 当fetch2拥有> 1个GenBank记录时该如何做; how to parse these onto separate rows within a dataframe? 如何将它们解析到数据帧内的单独行上?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM