주어진 CAS 번호와 관련된 데이터 가져 오기 NIST WebBook 웹 사이트에서 R로

StackOverflow https://stackoverflow.com//questions/20004779

  •  20-12-2019
  •  | 
  •  

문제

제공된 API를 사용하여 NIST 웹 북 웹 사이트에서 주어진 CAS 레지스트리 번호 (화학적 초록 서비스 NR)와 관련된 정보를 검색하고 싶습니다.

e.g. CAS NR의 경우. "19431-79-9"(Caryophylladienol II), http : // webbook. nist.gov/cgi/cbook.cgi?id=19431-79-9 & ;units=si&mask=2000#gas-chrom 나는

에 대해서도 얻었습니다
casno = "19431-79-9"
casno2 = gsub("-", "", casno)
raw=readLines(paste('http://webbook.nist.gov/cgi/cbook.cgi?ID=',casno,'&Units=SI&Mask=2000#Gas-Chrom', sep=""))

# mass spec, empty here, but not e.g. for casno2="630035" 
casno2="630035"
jcampfile = readLines(paste("http://webbook.nist.gov/cgi/cbook.cgi?JCAMP=C",casno2,"&Index=0&Type=Mass",sep=""))
if (jcampfile[[1]]=="##TITLE=Spectrum not found.") jcampfile=NA              

casno2 = gsub("-", "", casno)
# molecular stucture
molfile2d=readLines(paste("http://webbook.nist.gov/cgi/cbook.cgi?Str2File=C",casno2,sep=""))
if (molfile2d==character(0)) molfile2d=NA
molfile3d=readLines(paste("http://webbook.nist.gov/cgi/cbook.cgi?Str3File=C",casno2,sep=""))
if (molfile3d==character(0)) molfile3d=NA
.

원시 출력의 다음 비트에서 다음 변수 및 목록을 추출하는 것을 좋아합니다.

"name=\" Top \">Caryophylladienol II</a></h1>" 
-> name="Caryophylladienol II"

"Formula</a>:</strong> C<sub>15</sub>H<sub>24</sub>O</li>\n \n \n<li><strong>" 
-> formula="C15H24O"

"Molecular weight</a>:</strong> 220.3505</li>\n \n \n<li>" 
-> MW=220.3505

"IUPAC Standard InChI:</strong>\n \n<br /><table>\n<tr><td>\n<ul style=\" list-style-type: circle;\">\n<li><tt>InChI=1S/C15H24O/c1-10-6-8-14(16)11(2)5-7-13-12(10)9-15(13,3)4/h12-14,16H,1-2,5-9H2,3-4H3/t12?,13?,14-/m1/s1</tt></li>\n" 
-> InChI="InChI=1S/C15H24O/c1-10-6-8-14(16)11(2)5-7-13-12(10)9-15(13,3)4/h12-14,16H,1-2,5-9H2,3-4H3/t12?,13?,14-/m1/s1" 

"IUPAC Standard InChIKey:</strong>\n<tt>CIIYOYPOMGIECX-JXQTWKCFSA-N</tt>" 
-> InChiKey="CIIYOYPOMGIECX-JXQTWKCFSA-N"

"Stereoisomers:....<strong>
-> stereoisomers=XXX (list of stereoisomers)

"Other names:...\n"
-> synonyms=XXX (list of synonyms)

"Normal alkane RI..."
-> list of measured RIs plus on which column they were measured
e.g. here RIs=c(1637,1631,1627,1656,1615,1638,1628,1602,1611,1635,1622,1622,1627); columns=c("HP-5 MS","DB-5","RTX-1","Col-Elite 5MS","DB-5","DB-5","DB-5","DB-1","DB-5","CP Sil 5 CB","BP-1","RTX-1","DB-5")
.

Parsing의 종류를 가장 잘 수행하는 방법에 대한 생각은 무엇입니까? 이상적으로는 CAS NRS 목록을 입력으로 사용하는 함수로 랩핑되어 NIST 웹 북의 정보를 사용하여 텍스트 파일에 씁니다. 그러나 그것을 세련되게 할 필요가 없습니다 - 나를 시작하는 것은 정말로 도움이 될 것입니다!

편집 : 패키지 XML에서 HTMLTeeParse를 사용하여 HTML 파일을 구문 분석하려고하지만, 나는 성공하지 못합니다. 그 기능에 대해 조금 더 많은 경험을 가진 사람은 어떤 기회에 의해 조금 도움이 될 수 있습니까?

편집 : Mathematica에서 데이터를 가져 오는 솔루션을 알아 냈습니다. https://mathematica.stackexchange.com/questions/37091/look-up-info-associated-with-a-given-cas-chemical -identifier - 니트 - 웹보 - 웹보 . 누구든지 그 코드를 r에 해당하는지에 대한 기술을 가질 경우 알려주십시오!

도움이 되었습니까?

해결책

질문의 첫 번째 URL 문자열의 경우

를 시도하십시오.
casno = "19431-79-9"
url <- paste('http://webbook.nist.gov/cgi/cbook.cgi?ID=',casno,'&Units=SI&Mask=2000#Gas-Chrom', sep="")
doc <- htmlParse(url)

name <- xpathSApply(doc, "//a[@id='Top']", xmlValue)
name
[1] "Caryophylladienol II"
.

굵게 표시된 모든 목록을 잡아줍니다 (디스플레이 용 일부 출력)

x <- xpathSApply(doc, "//li/strong/..", xmlValue)
x

[1] "Formula: C15H24O" 
[2] "Molecular weight: 220.3505" 
[3] "IUPAC Standard InChI:\n\n\nInChI=1S/C15H24O/c1-10-6-8-14(16)11(2)5-7-13-12(10)9-15(13,3)4/h12-14,16H,1-2,5-9H2, ...
[4] "IUPAC Standard InChIKey:\nCIIYOYPOMGIECX-JXQTWKCFSA-N" 
[5] "CAS Registry Number: 19431-79-9"  
[6] "Chemical structure: \nThis structure is also available as a 2d Mol file\n
[7] "Species with the same structure:\nCaryophylla-4(14), 8(15)-dien-5-ol\n\n"
[8] "Stereoisomers:\nCaryophylladienol I\nCaryophylla-3(15),7(14)-dien-6-ol\n«alpha»-Caryophylladienol\nExo methylene ...
[9] "Other names:\nCaryophylla-4(14),8(15)-dien-5«alpha»-ol;\nCaryophylla-2(12),6(13)-dien-5-«alpha»-ol;\nCaryophylla ...
[10] "Information on this page:\nGas Chromatography\nReferences\nNotes / Error Report\n\n"
[11] "Options:\nSwitch to calorie-based units\n\n" 
.

파일에만 쓰기 만하면 요소 8의 구분 된 목록을 수정할 수 있습니다 (뉴라인을 반복하여 뉴라인을 교체)하고 나머지 뉴라인을 제거 할 수 있습니다.

x <- gsub(":\n", ": ", x) 
x[8] <- gsub("\n+", ";", x[8])
x <- gsub("\n", "", x)
x <- gsub("Download the identifier in a file.", "", x)
.

테이블에 대한 readhtmltable을 사용합니다

y <-readHTMLTable(doc, stringsAsFactors=FALSE)
.

다음 행을 계산하여 올바른 테이블을 찾고 값 가져 오기

sapply(y, nrow)
NULL NULL NULL NULL NULL NULL 
   1    1    5   13    6    1 

y[[4]][,2:3]
    Active phase     I
1        HP-5 MS 1637.
2        DB-5 MS 1631.
3          RTX-1 1627.
4  Col-Elite 5MS 1656.
5           DB-5 1615.
...

ri <- paste0(gsub(".", "", y[[4]][,3], fixed=TRUE), "=", y[[4]][,2], collapse=";")
ri
[1] "1637=HP-5 MS;1631=DB-5 MS;1627=RTX-1;1656=Col-Elite 5MS;1615=DB-5;1638=DB-5;1628=DB-5;1602=DB-1;1611=DB-5;1635=CP Sil 5 CB;1622=BP-1;1622=RTX-1;1627=DB-5"
.

마지막으로 파일을 결합하고 씁니다

cas <- c(paste("Name:", name), x[c(1:5,7:9)], paste("RI:", ri) )
write( cas, file="cas.out")
.

정렬되지 않은 목록에서 값을 잡는 다른 방법은 예를 들어 모든 입체 이성질체를 벡터로 가져옵니다 ...

stereo <- xpathSApply(doc, "//li/strong[text()='Stereoisomers:']/../ul/li/a", xmlValue)
 [1] "Caryophylladienol I"                       "Caryophylla-3(15),7(14)-dien-6-ol"         "«alpha»-Caryophylladienol"                
 [4] "Exo methylene isomer of Caryophyllenol I"  "«beta»-Caryophylla-4(14),8(15)-dien-5-ol"  "Caryophylla-4(12),8(13)-dien-5-«beta»-ol" 
 [7] "Caryophylla-4,8-dien-5-ol"                 "Caryophylla-4(12),8(13) diene 5 «beta»-ol" "Caryophyla-4(14),8(15)-dien-5-ol"         
[10] "Caryophylla-4(12).8(13)-diene-5«beta»-ol"  "2(12),6(13)-Caryophylladien-5-ol"
.

를 한 다음 여러 줄을 파일에 씁니다.

paste("Stereoisomer:", stereo)
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top