Преобразование идентификатора CID из реестра CAS в Pubchem в R

Раздражающая проблема, с которой сталкиваются многие химики, заключается в преобразовании регистрационных номеров химических соединений CAS (хранящихся в какой-либо коммерческой базе данных, которая недоступна) в идентификаторы Pubchem (открытые). Тип Pubchem поддерживает преобразование между ними, но только через их ручной веб-интерфейс, а не через официальный программный интерфейс PUG REST.

Решение на Ruby приведено здесь на основе интерфейса электронных утилит: http://depth-first.com/articles/2007/09/13/hacking-pubchem-convert-cas-numbers-into-pubchem-cids-with-ruby/

Кто-нибудь знает, как это перевести на R?

РЕДАКТИРОВАТЬ: на основе ответа ниже, наиболее элегантное решение:

library(XML)
library(RCurl)

CAStocids=function(query) {
  xmlresponse = xmlParse( getURL(paste("http://www.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pccompound&retmax=100&term=",query,sep="") ) )
  cids = sapply(xpathSApply(xmlresponse, "//Id"), function(n){xmlValue(n)})
  return(cids)
}

> CAStocids("64318-79-2")
[1] "6434870" "5282237"

ура, Том

2 ответа

Решение

Вот как это делает код Ruby, переведенный на R RCurl а также XML:

> xmlresponse = xmlParse( getURL("http://www.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pccompound&retmax=100&term=64318-79-2") )

и вот как извлечь узлы Id:

> sapply(xpathSApply(xmlresponse, "//Id"), function(n){xmlValue(n)})
 [1] "6434870" "5282237"

обернуть все это в функцию....

 convertU = function(query){
    xmlresponse = xmlParse(getURL(
       paste0("http://www.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pccompound&retmax=100&term=",query))) 
    sapply(xpathSApply(xmlresponse, "//Id"), function(n){xmlValue(n)})
 }

> convertU("64318-79-2")
[1] "6434870" "5282237"
> convertU("64318-79-1")
list()
> convertU("64318-78-2")
list()
> convertU("64313-78-2")
[1] "313"

возможно, нужен тест, если не найден.

Я думаю, что вы все равно сможете конвертировать номера CAS в идентификаторы PubChem, используя PUG, где вместо имени соединения вы вводите номер CAS. Конечно, это может быть не так конкретно, если числа CAS перекрываются. Я не проверял это.

Пример с аспирином https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/50-78-2/cids/JSON

Другие вопросы по тегам