R:从Pubchem解析JSON / XML导出的复合属性

时间:2015-09-17 15:33:33

标签: json xml r xml-parsing pubchem

我想使用JSON(或XML)导出工具解析在Pubchem in R中给出的给定化合物的所有化学特性。

示例:ALPHA-IONONE,pubchem化合物ID 5282108

https://pubchem.ncbi.nlm.nih.gov/compound/5282108

library("rjson")
data <- rjson::fromJSON(file="https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/5282108/JSON/?response_type=display")

library("RJSONIO")
data <- RJSONIO::fromJSON("https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/5282108/JSON/?response_type=display")

会给我一个嵌套列表树,但是如何从这个相当复杂的嵌套列表列表转到一个漂亮的数据帧或数据帧列表?

在这种情况下,我所追求的是

下的一切

3.1计算描述符

3.2其他标识符

3.3同义词

4.1计算属性

在一行数据框中,每个元素在一个单独的命名列中,每个元素有多个项目(例如多个同义词)与&#34; |&#34;作为分隔符。例如。在这种情况下类似

pubchemid      IUPAC_Name    InChI       InChI_Key     Canonical SMILES      Isomeric SMILES     CAS     EC Number     Wikipedia      MeSH Synonyms     Depositor-Supplied Synonyms   Molecular_Weight    Molecular_Formula    XLogP3   Hydrogen_Bond_Donor_Count ... 
5282108        (E)-4-(2,6,6-trimethylcyclohex-2-en-1-yl)but-3-en-2-one       InChI=1S/C13H20O/c1-10-6-5-9-13(3,4)12(10)8-7-11(2)14/h6-8,12H,5,9H2,1-4H3/b8-7+ ....

具有多个项目的字段(例如存款人提供的同义词)可以与&#34; |&#34;一起粘贴,例如价值可能是ALPHA-IONONE | Iraldeine | ......

其次,我还要导入部分 4.2.2 Kovats保留指数 作为数据框

pubchemid      column_class            kovats_ri
5282108        Standard non-polar      1413
5282108        Standard non-polar      1417
...
5282108        Semi-standard non-polar 1427
...

(第4.3.1节GC-MS本来也不错,但由于它只显示3个顶峰,现在这有点无用,所以我会跳过它)

有人知道如何以优雅的方式实现这一目标吗?

PS请注意,并非所有这些字段都必须存在于任何给定的查询中。

2D结构和一些属性也可以从

获得

https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/5282108/record/SDF/?record_type=2d&response_type=display

和来自

的3D结构

https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/5282108/record/SDF/?record_type=3d&response_type=display

也可以使用

将数据导出为XML

https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/5282108/XML/?response_type=display

如果那会更容易

注意:也尝试使用R包rpubchem,但是这个只是导入了少量的可用信息:

library("rpubchem")
get.cid(5282108)
CID  IUPACName CanonicalSmile MolecularFormula MolecularWeight TotalFormalCharge XLogP HydrogenBondDonorCount HydrogenBondAcceptorCount HeavyAtomCount    TPSA
2 5282108 (E)-4-(2,6,6-trimethylcyclohex-2-en-1-yl)but-3-en-2-one        C13H20O       192.297300               0                 3     0                      1                        14             17 5282108

1 个答案:

答案 0 :(得分:1)

我的建议适用于XML文件,因为(感谢XPath)我发现遍历和选择节点更方便。

请注意,这既不快(在测试时花费几秒钟)也不是最佳的(我解析每个文件两次 - 一次用于名称等,一次用于Kovats保留索引)。但我想你会想要解析一些文件集并继续你的真实业务,而过早的优化是所有邪恶的根源。

我已将主要任务分为不同的功能。如果您想获取某个特定pubchem记录的数据,则可以使用它们。但是如果你想一次从几个pubchem记录中获取数据,你可以定义指向数据的指针向量,并使用底部的示例将结果合并在一起。在我的例子中,vector包含本地磁盘上文件的路径。也支持URL,虽然我会阻止它们(请记住,每个站点都会被请求两次,如果有更多的记录,你可能想要以某种方式处理错误的网络。)

您链接的化合物在&#34; EC编号&#34;上有多个条目。它们的确有所不同ReferenceNumber,但不是Name。我不确定为什么会这样,我应该怎么做(你的样本输出只包含EC编号的一个条目),所以我把它留给了R.R将后缀添加到重复值并创建{{1 }},EC.Number.1等。这些后缀与文件中的EC.Number.2匹配,并且主数据框中的相同列可能会引用不同的ReferenceNumber不同的化合物。

似乎pubchem使用以下格式标记ReferenceNumber。在很少的地方我有硬编码<type>Value[List],但也许某些化合物在相同的字段中有不同的类型。除了请求之外,我通常不会考虑列表。因此,在此代码中抛出更多数据时,可能需要进一步修改。

如果您有任何疑问,请在评论中发布。我不确定是否应该解释该代码或什么。

StringValue