如何自动分块批量调用clinicaltrials.gov API获取NCT数据?
解决ClinicalTrials.gov API批量查询的限制问题
问题背景
你有一个仅包含"NCT编号"的单列数据框,示例数据如下:
NCT <- structure(list(`NCT Number` = c("NCT01772004", "NCT02513394", "NCT02873195", "NCT01872975", "NCT02750826", "NCT02517398")), row.names = c(NA, 6L), class = "data.frame")
使用原有代码查询ClinicalTrials.gov API时,小批量数据运行正常,但处理600行数据会触发API请求限制报错,需要实现自动分块循环调用的方案,满足月度重复执行的需求。
解决方案代码
以下是自动分块、循环调用API并合并结果的实现,加入了请求延迟避免触发限制:
library(clinicaltrialr) library(pbapply) library(dplyr) # 设置分块大小(根据API限制调整,比如每次处理20个编号) chunk_size <- 20 # 将NCT编号拆分为若干分块 nct_chunks <- split(NCT$`NCT Number`, ceiling(seq_along(NCT$`NCT Number`) / chunk_size)) # 初始化空列表存储结果 trials_list <- list() # 循环处理每个分块 for (i in seq_along(nct_chunks)) { cat("正在处理第", i, "/", length(nct_chunks), "个分块...\n") # 调用API获取当前分块的研究数据 chunk_data <- pbapply::pblapply(nct_chunks[[i]], ct_read_trial, cl = 7) # 将当前分块结果存入列表 trials_list[[i]] <- dplyr::bind_rows(chunk_data) # 分块间添加延迟,避免触发API频率限制(可根据实际情况调整时长) Sys.sleep(10) } # 合并所有分块的结果 trials <- dplyr::bind_rows(trials_list)
代码说明
- 分块设置:
chunk_size可根据ClinicalTrials.gov的API限制调整,一般建议单次请求数量不超过50(实际以官方限制为准) - 分块拆分:用
split()和ceiling(seq_along())将NCT编号列表均匀拆分为多个小分块 - 循环处理:遍历每个分块调用API,同时打印进度便于监控
- 请求延迟:
Sys.sleep(10)在分块请求间添加10秒延迟,避免短时间内请求过多触发限制,时长可根据实际情况调整 - 结果合并:最后用
bind_rows()将所有分块的结果合并为一个完整数据框
内容的提问来源于stack exchange,提问作者Joe Crozier
相关产品推荐
相关产品推荐

