在R中实现get_CIDname()函数:从PubChem通过CID获取化合物名称
问题
需要编写get_CIDname()函数,将数据框中CID(化合物ID)替换为PubChem数据库对应的化合物主名称。现有包含CID列的数据框示例:
df <- data.frame("Compound" = c(176,29096,6341,8914,5366204,98464,11572,9231,535144,15669393,1738127,1738124), "Value" = rnorm(12, mean = 500000, sd = 600000))
期望新增Match列存储对应名称,已有部分代码但不知如何解析HTML:
get_CIDname <- function(CID){ read_html(paste0("https://pubchem.ncbi.nlm.nih.gov/compound/", CID)) }
技术说明
你正在做的是**网页抓取(Web Scraping)**中的HTML解析环节,通过定位网页特定元素来提取目标数据。
实现步骤
- 依赖包准备:使用
rvest包专门做网页解析,先安装加载:
install.packages("rvest") library(rvest) library(dplyr) library(purrr)
- 完善解析函数:PubChem页面的化合物主名称对应
h1.title-and-breadcrumb__title元素,修改函数提取该内容并添加错误处理:
get_CIDname <- function(CID) { # 构造URL并读取页面 url <- paste0("https://pubchem.ncbi.nlm.nih.gov/compound/", CID) page <- tryCatch(read_html(url), error = function(e) return(NA)) if (is.na(page)) { return("CID不存在或无法访问") } # 提取主名称 name <- page %>% html_element("h1.title-and-breadcrumb__title") %>% html_text(trim = TRUE) # 处理无结果情况 if (is.na(name)) { return("未找到对应名称") } else { return(name) } }
- 批量处理数据框:用
purrr::map批量对CID列调用函数,新增Match列:
df <- df %>% mutate(Match = map_chr(Compound, get_CIDname))
运行后即可得到包含化合物名称的结果列,例如CID=176会返回"Acetic Acid",CID=29096返回"Dihydromyrcenol"。
内容的提问来源于stack exchange,提问作者user7264
相关产品推荐
相关产品推荐

