首页 > 解决方案 > 使用每个查询限制的结果运行 BLS API 大型数据帧并在 R 中另存为数据帧

问题描述

我正在尝试使用 BLS API 提取大量数据(约 50 万个单独的系列 ID)并将输出存储为数据帧。

我遇到了两个问题:

  1. BLS API 每天只允许 50 个结果/查询和 2.5K 查询
  2. 将输出保存为编译的数据框

我创建了一个只有一列“系列 ID”的数据框,这是 BLS API 吐出该特定 ID 上的数据所需的信息。为了绕过结果/查询限制,我尝试将所有 500K 系列 ID 的数据框分成 250 个组(以保持在每天的查询限制之下),并使用一个函数分别在每个组中运行 bls_api 代码。我相信这可能有效,但我无法看到输出。为了尝试将输出保存在数据帧中,我创建了一个空白数据帧并尝试将 BLS 数据函数输出与空白数据帧进行 rbind。

创建一个空白数据框以将 BLS 输出存储在

output <- data.frame();

在 250 行系列 ID 的段上运行 BLS API 代码

unlist(lapply(split(df$`Series ID`, rep(1:250)),
function(Data)
{bls_data <- bls_api(Data,startyear=2016, endyear= 2019, Sys.getenv("BLS_KEY"));
output <- rbind(output,bls_data)}))

虽然我BLS_API (ie. "REQUEST_SUCCEEDED")在控制台中看到了输出,但输出并未保存为数据帧“输出”(数据帧仍为空白)。

我是函数新手,所以任何建议都很有价值!

标签: rfunctionapilapplyrbind

解决方案


这是我能够弄清楚的。不是最优雅的解决方案,但可以完成工作!

定义每组所需的行数

nSegments <- 250

根据上面定义的行数将系列 ID 拆分为段

series_ids_split <- split(df, 
(seq(nrow(df))-1) %/% nSegments)

具有明确数据输出的系列 ID 的运行功能

total_output <- lapply(eries_ids_split, function(x){
x <- bls_api(x,startyear = 2018, endyear = 2019, Sys.getenv("BLS_KEY"))
return(x)
})

将数据帧列表合并到输出数据帧中 output_df <- do.call(rbind,total_output)


推荐阅读