使用R从XML文件中提取数据的问题

时间:2014-05-23 21:46:02

标签: xml r parsing

我在xml文件中有一个大型蛋白质数据库,我需要从使用R中提取一些信息。数据库由条目组织,其中包含有关我需要提取和格式化的特定蛋白质的信息。

https://www.dropbox.com/s/dq8ir9f22cnfwrz/Sample.xml

我想提取名称,所有类型为“EC”的dbReferences,以及每个条目的序列。到目前为止,我有:

library("XML")
doc <- xmlParse("Sample.xml")

我在考虑使用xpathSApply函数明确选择要转到的标签,或xmlToDataFrame函数。我是R的新手,所以我对从哪里开始感到困惑。

1 个答案:

答案 0 :(得分:0)

只需从getNodeSet

中选择所需的元素即可
nd <- getNodeSet(doc, "//ns:entry", namespaces=c(ns=getDefaultNamespace(doc)[[1]]$uri))
y <- data.frame( id = sapply(nd, xpathSApply, './*[local-name()="name"]', xmlValue),
        ec = sapply(nd,  function(y) paste( xpathSApply(y, './/*[local-name()="dbReference" and @type="EC"]/@id'), collapse="; ")),
 sequence =  gsub("\n", "", sapply(nd, xpathSApply, './*[local-name()="sequence"]', xmlValue)))

head(y, 3)
           id                                                                      ec                                         sequence  
1 AK1C3_HUMAN 1.-.-.-; 1.1.1.357; 1.1.1.112; 1.1.1.188; 1.1.1.239; 1.1.1.64; 1.3.1.20  MDSKHQCVKLNDGHFMPVLGFGTYAPPEVPRSKALEVTKLAIEA...
2 CP3A4_HUMAN              1.14.13.-; 1.14.13.157; 1.14.13.32; 1.14.13.67; 1.14.13.97  MALIPDLAMETWLLLAVSLVLLYLYGTHSHGLFKKLGIPGPTPL...
3 AK1C1_HUMAN                                 1.1.1.-; 1.1.1.149; 1.1.1.112; 1.3.1.20  MDSKYQCVKLNDGHFMPVLGFGTYAPAEVPKSKALEATKLAIEA...

您也可以删除命名空间并简化这些查询...

x <- readLines("Sample.xml")
x[2] <- "<uniprot>"
doc <- xmlParse(x)
nd <- getNodeSet(doc, "//entry")

或者使用Uniprot的Rest服务

http://www.uniprot.org/uniprot/?query=AK1C3_HUMAN+OR+CP3A4_HUMAN+OR+AK1C1_HUMAN&format=tab&columns=entry%20name,ec,sequence