如何在R中突破1000行限制查询CDC的API数据?
解决CDC Socrata API查询限制与筛选问题
1. 修复查询参数错误
你的R代码报错是因为query参数传入的是R表达式usa_or_hhsregion == "9",而不是API要求的键值对列表。正确写法是把筛选条件包装成命名列表:
library(httr) # 正确的筛选请求 res <- GET("https://data.cdc.gov/resource/jr58-6ysp.json", query = list(usa_or_hhsregion = "9"))
这样就能精准筛选出usa_or_hhsregion等于"9"的数据,而非默认返回的region1数据。
2. 突破1000行返回限制
CDC使用的是Socrata API,默认单请求最多返回1000行,要获取全部数据需用分页查询——核心是通过$limit(设置每页最大行数,最高支持5000行)和$offset(设置起始偏移量)参数循环请求,直到返回空数据为止。
完整R代码示例(CSV端更适合海量数据)
以下是自动分页获取所有region9数据的脚本:
library(httr) library(readr) base_url <- "https://data.cdc.gov/resource/jr58-6ysp.csv" limit <- 5000 # 每页最大行数,Socrata允许最高5000 offset <- 0 all_data <- data.frame() while(TRUE) { # 构造分页请求参数 query_params <- list( usa_or_hhsregion = "9", "$limit" = limit, "$offset" = offset ) # 发送请求并读取数据 res <- GET(base_url, query = query_params) current_data <- read_csv(content(res, "text")) # 当前页无数据则终止循环 if(nrow(current_data) == 0) break # 合并数据 all_data <- rbind(all_data, current_data) # 更新偏移量 offset <- offset + limit # 可选:打印进度 cat(sprintf("已获取 %d 行数据\n", nrow(all_data))) } # 保存最终数据 write_csv(all_data, "cdc_region9_data.csv")
补充说明
- CSV端点比JSON更高效,百万级数据解析速度更快
- 若遇到请求不稳定,可添加
$order参数(如$order = "id ASC")确保分页顺序一致,避免重复或遗漏 - 部分Socrata API支持
$page参数,但$offset+$limit的兼容性更好
内容的提问来源于stack exchange,提问作者shollaback
相关产品推荐
相关产品推荐

