我想使用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结构和一些属性也可以从
获得和来自
的3D结构也可以使用
将数据导出为XMLhttps://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
答案 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