【发布时间】:2020-01-25 22:55:11
【问题描述】:
我正在尝试使用 BLS API 提取大量数据(约 500K 单个系列 ID)并将输出存储为数据帧。
我遇到了两个问题:
- BLS API 仅允许 50 个结果/查询和每天 2.5K 查询
- 将输出保存为已编译的数据帧
我创建了一个数据框,其中只有一列“系列 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") 的输出,但输出并未保存为数据框“输出”(数据框仍为空白)。
我是函数新手,所以任何建议都很有价值!
【问题讨论】:
-
我通常会将每个 api 调用结果保存到一个列表中,然后
do.call(rbind, mylist)以获得最终的输出数据集。在谷歌上搜索concatenating data frames in r,有大量关于此的博客文章。 -
另外,这是一个明确的
for循环就可以的时代之一。它在这里更加灵活和可读,我不认为它会导致任何性能损失。 -
我尝试使用
list(split(df,as.numeric(rownames(df))-1)%/%250)将我的数据框拆分为一个列表的另一个版本,但无法从那里找出适用于数据框列表的正确循环
标签: r function api lapply rbind