R语言自动化脚本:高效挖掘TCMSP中药成分与基因靶点关联

📅 2026/6/19 20:49:11
R语言自动化脚本:高效挖掘TCMSP中药成分与基因靶点关联
1. 为什么需要自动化处理TCMSP数据如果你正在研究中医药现代化或者生物信息学肯定对TCMSP数据库不陌生。这个全称为Traditional Chinese Medicine Systems Pharmacology的数据库包含了大量中药成分及其对应的基因靶点信息。但每次手动查询、复制粘贴数据的过程实在太痛苦了——特别是当你需要分析几十种中药成分时。我刚开始做相关研究时经常要花一整天时间在浏览器和Excel之间来回切换。直到有一天实在受不了这种重复劳动才决定用R语言写个自动化脚本。现在回想起来这个决定至少帮我节省了上百小时的工作时间。下面我就把这个经过实战检验的脚本分享给你让你也能一键获取TCMSP中的关键数据。这个脚本的核心价值在于三点首先是完全自动化输入中药名称就能获取所有相关靶点其次是可定制化你可以自由设置OB口服生物利用度和DL类药性的筛选阈值最后是批量处理能力可以一次性分析多味中药结果自动合并输出。2. 准备工作与环境配置2.1 必备R包安装在开始之前我们需要确保安装了必要的R包。打开你的RStudio运行以下命令安装依赖install.packages(c(rvest, httr, jsonlite, dplyr, data.table, tidyverse, stringr))这些包各司其职rvest用于网页抓取httr处理HTTP请求jsonlite解析JSON数据dplyr和tidyverse进行数据整理stringr处理字符串。如果安装过程中遇到网络问题可以尝试更换CRAN镜像源。2.2 获取TCMSP访问权限TCMSP数据库需要注册才能获取完整的API访问权限。注册过程很简单访问TCMSP官网点击注册按钮填写基本信息登录后获取你的API token这个token会附加在每个查询URL的末尾作为身份验证。虽然有些基础数据不需要token也能获取但为了完整的数据访问建议还是先注册一个账号。3. 核心脚本解析3.1 基础设置与参数配置让我们先看看脚本的基础框架。创建一个新的R脚本文件我通常命名为tcmsp_auto.R然后添加以下内容library(rvest) library(httr) library(jsonlite) library(dplyr) library(data.table) library(tidyverse) library(stringr) # 设置工作目录替换为你自己的路径 setwd(E:/code/R) # 关键筛选阈值 obThresholdValue 30 # 口服生物利用度阈值(%) dlThresholdValue 0.18 # 类药性阈值 # 中药名称和对应URL names - c(Aiye, Dangshen) urls - c( https://tcmsp-e.com/tcmspsearch.php?qrFolium%20Artemisiae%20Argyiqsrherb_en_nametoken你的token, https://tcmsp-e.com/tcmspsearch.php?qrCodonopsis%20Radixqsrherb_en_nametoken你的token )这里有几个关键点需要注意obThresholdValue和dlThresholdValue是两个最重要的筛选参数根据研究需求可以调整names和urls需要一一对应且url中的token需要替换为你自己的Windows系统下路径要用正斜杠(/)或者双反斜杠(\)3.2 数据抓取与解析逻辑脚本的核心是一个循环处理过程对每味中药分别进行数据抓取和清洗all_drug_target - tibble(DrugNA,MOL_IDNA,molecule_nameNA,target_nameNA) num - 1 for (url in urls) { name - names[num] print(paste(正在处理:, name)) num - num 1 # 获取网页内容 web - read_html(GET(url, encodingUTF-8, config(ssl_verifypeer FALSE))) # 提取JavaScript中的数据 tcmsp - web %% html_elements(script) %% html_text() test1 - str_extract_all(tcmsp, data:\\s\\[.*\\]) test2 - unlist(test1[12]) # 解析化合物数据 drug_m - str_replace(test2[1], data:, ) %% fromJSON(simplifyVector TRUE) %% mutate(across(c(ob, dl), as.numeric)) %% filter(ob obThresholdValue dl dlThresholdValue) # 解析靶点数据并与化合物关联 drug_t - str_replace(test2[2], data:, ) %% fromJSON(simplifyVector TRUE) %% semi_join(drug_m, by MOL_ID) %% tibble() %% add_column(Drug name, .before molecule_ID) %% select(Drug, MOL_ID, molecule_name, target_name) # 合并结果 all_drug_target - all_drug_target %% add_row(drug_t) }这段代码的工作原理是通过GET请求获取TCMSP的网页内容从网页的JavaScript代码中提取出包含化合物和靶点信息的JSON数据将JSON转换为数据框并进行筛选基于OB和DL值关联化合物和对应的靶点信息将所有中药的结果合并到一个数据框中3.3 结果输出与后处理数据处理完成后我们需要对结果进行清理和保存# 清理无效行和重复项 final_result - all_drug_target %% filter(!is.na(Drug) !is.na(MOL_ID) !is.na(molecule_name) !is.na(target_name)) %% distinct(target_name, molecule_name, Drug, MOL_ID, .keep_all TRUE) # 保存结果 write.table(final_result, fileAllDrugTarget.txt, sep\t, row.namesFALSE, quote FALSE)这样我们就得到了一个干净的、结构化的数据集包含以下关键信息中药名称(Drug)化合物ID(MOL_ID)化合物名称(molecule_name)靶点名称(target_name)文件会保存在你设置的工作目录下可以用Excel直接打开查看。4. 高级应用与技巧4.1 批量处理大量中药当需要分析数十种中药时手动准备URL列表会很麻烦。这里分享一个我常用的技巧——从Excel表格批量导入# 准备一个CSV文件包含name和url两列 drug_list - read.csv(drug_list.csv, stringsAsFactors FALSE) names - drug_list$name urls - drug_list$url这样你只需要维护一个CSV文件添加新的中药时只需在表格中添加一行不用修改脚本代码。4.2 结果可视化分析获取数据后通常还需要进行可视化分析。这里推荐使用ggplot2快速生成靶点分布图library(ggplot2) # 统计每味中药的靶点数量 target_count - final_result %% group_by(Drug) %% summarise(Count n_distinct(target_name)) # 绘制条形图 ggplot(target_count, aes(xreorder(Drug, Count), yCount)) geom_bar(statidentity, fillsteelblue) coord_flip() labs(x中药名称, y靶点数量, title各中药对应靶点数量分布) theme_minimal()这张图能直观展示不同中药的靶点丰富度帮助你快速识别出值得深入研究的候选药物。4.3 网络图展示靶点互作对于更复杂的分析可以构建中药-靶点网络图library(igraph) library(ggraph) # 创建边列表 edges - final_result %% select(Drug, target_name) # 创建图对象 g - graph_from_data_frame(edges, directed FALSE) # 简单绘图 plot(g, vertex.label.cex0.7, vertex.size10, edge.arrow.size0.5, layoutlayout_with_kk)这能直观展示中药与靶点之间的复杂关系发现潜在的协同作用或共同作用靶点。5. 常见问题与解决方案在实际使用过程中你可能会遇到一些技术问题。以下是我遇到过的典型问题及解决方法问题1SSL证书验证失败错误信息可能包含SSL certificate problem。这是因为TCMSP网站的SSL证书配置问题。解决方案是在GET请求中添加config(ssl_verifypeer FALSE)参数如我们脚本中所示。问题2数据提取为空如果发现最终结果为空可能是以下原因OB或DL阈值设置过高尝试降低这些值TCMSP网站改版导致数据位置变化需要检查网页源代码确认新的数据位置API token失效重新登录获取新的token问题3中文乱码问题如果中药名称包含中文出现乱码确保在GET请求中指定了正确的编码GET(url, encodingUTF-8, ...)问题4处理速度慢当分析大量中药时脚本运行可能需要较长时间。可以考虑添加进度条提示使用并行处理如parallel包设置超时时间避免卡死# 添加简单进度提示 print(paste(已完成, num-1, /, length(urls), 味中药分析))6. 脚本优化与扩展基础脚本已经能完成核心功能但根据不同的研究需求还可以进行多种扩展6.1 添加更多数据字段TCMSP实际上提供了更多化合物属性如MW分子量AlogP脂溶性Hdon氢键供体数Hacc氢键受体数修改select语句即可包含这些字段select(Drug, MOL_ID, molecule_name, target_name, MW, AlogP, Hdon, Hacc)6.2 结果自动导入到数据库对于长期研究可以将结果直接存入数据库library(RSQLite) # 创建或连接SQLite数据库 con - dbConnect(RSQLite::SQLite(), tcmsp_data.db) # 写入数据 dbWriteTable(con, drug_target, final_result, overwriteTRUE) # 关闭连接 dbDisconnect(con)6.3 添加日志记录功能对于自动化运行添加日志记录很有必要# 在脚本开头 log_file - tcmsp_log.txt write(paste(分析开始于:, Sys.time()), filelog_file, appendTRUE) # 在每个药物处理完成后 write(paste(已完成, name, 的分析, Sys.time()), filelog_file, appendTRUE)7. 实际应用案例让我分享一个真实的应用场景。去年在研究抗炎中药时我需要分析15种常用抗炎中药的潜在作用机制。手动查询这些中药的靶点需要至少两天时间而使用这个脚本我只用了不到一小时就获取了所有数据。具体流程是准备15种中药的名称和URL列表设置OB≥30%和DL≥0.18的筛选条件运行脚本获取所有靶点使用clusterProfiler进行KEGG通路富集分析识别出TNF、IL-6等关键炎症相关靶点最终不仅快速完成了预定分析还意外发现了几种中药可能通过相同靶点发挥协同作用这成为了后续实验验证的重点方向。8. 与其他工具的整合这个脚本的输出可以方便地与其他生物信息学工具对接与Cytoscape整合将结果保存为CSV直接导入Cytoscape构建网络图write.csv(final_result, for_cytoscape.csv, row.namesFALSE)与clusterProfiler整合进行通路富集分析library(clusterProfiler) library(org.Hs.eg.db) # 转换基因名到ENTREZID gene_list - bitr(unique(final_result$target_name), fromTypeSYMBOL, toTypeENTREZID, OrgDborg.Hs.eg.db) # GO富集分析 go_results - enrichGO(gene gene_list$ENTREZID, OrgDb org.Hs.eg.db, keyType ENTREZID, ont BP, pvalueCutoff 0.05)与Shiny整合构建交互式Web应用library(shiny) ui - fluidPage( titlePanel(TCMSP数据分析), sidebarLayout( sidebarPanel( fileInput(file, 上传药物列表), numericInput(ob, OB阈值, 30), numericInput(dl, DL阈值, 0.18) ), mainPanel( tableOutput(results) ) ) ) server - function(input, output) { output$results - renderTable({ # 这里调用我们的分析函数 analyze_tcmsp(input$file$datapath, input$ob, input$dl) }) } shinyApp(ui ui, server server)