You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言Rentrez从NCBI获取大肠杆菌序列时拉取错误数据

问题分析与解决方案

核心问题根源

你混淆了不同NCBI数据库的ID类型:entrez_search在biosample库返回的是BioSample样本编号(如SAMN30954130),而entrez_fetch调用nucleotide库需要的是核苷酸序列的专属ID/Accession号。直接将BioSample编号传给nucleotide库查询,会导致NCBI匹配到错误的关联数据(比如该BioSample可能和其他物种序列存在间接关联,但并非目标大肠杆菌序列)。

正确处理流程

单个样本修正代码

使用entrez_link直接从BioSample关联到对应的核苷酸序列ID,再拉取目标序列:

# 从BioSample链接到对应的核苷酸序列ID
link_result <- entrez_link(dbfrom = "biosample", db = "nucleotide", id = "SAMN30954130")
nucleotide_ids <- link_result$links$biosample_nucleotide

# 拉取目标大肠杆菌序列(示例用fasta格式,可替换为xml)
target_sequence <- entrez_fetch(db = "nucleotide", id = nucleotide_ids, rettype = "fasta")

批量样本处理代码

针对你最初的1283个BioSample,循环处理并提取关联序列(注意添加请求延迟避免触发NCBI限制):

# 初始搜索获取BioSample ID列表
search <- entrez_search(db = "biosample", 
                        term = "Escherichia coli[Organism] AND geo_loc_name=USA:WA[attr]",
                        retmax = 9999)

# 初始化存储列表
all_nucleotide_sequences <- list()

# 循环处理每个BioSample
for (biosample_id in search$ids) {
  # 关联到核苷酸序列ID
  link_result <- entrez_link(dbfrom = "biosample", db = "nucleotide", id = biosample_id)
  nucleotide_ids <- link_result$links$biosample_nucleotide
  
  # 如果有关联序列,拉取并存储
  if (!is.null(nucleotide_ids)) {
    seq <- entrez_fetch(db = "nucleotide", id = nucleotide_ids, rettype = "fasta")
    all_nucleotide_sequences[[biosample_id]] <- seq
  }
  
  # 添加1秒延迟,遵守NCBI API请求限制
  Sys.sleep(1)
}

关键注意事项

  • NCBI API限制每分钟最多10次请求,批量处理必须添加延迟(如Sys.sleep(1)),否则会被临时封禁访问
  • 部分BioSample可能未关联任何核苷酸序列,需通过is.null(nucleotide_ids)判断跳过
  • 若需要更详细的元数据关联,可先拉取BioSample的XML数据,解析其中的Relationships节点获取序列信息

内容的提问来源于stack exchange,提问作者notasfarwest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:40:39