如何在R语言中通过循环将API调用结果存储至数据框
解决API循环调用并将结果存入数据框的问题
我看了你的代码,发现几个关键问题需要修正:循环变量名错误、API请求字符串的拼接顺序不对,还有没有将每次调用的结果存入数据框。下面一步步帮你解决:
1. 修正基础设置中的小问题
首先,你的日期生成逻辑有个小错误:tail(dates-1, -1) 无法正确生成当月最后一天(比如2018-01-31),应该改成 tail(dates, -1) - 1。另外,你需要提前生成数据框需要的"年月"格式标签(比如01-2018)。还有原end_string开头漏了&,这会导致API请求解析失败,必须补上。
修正后的基础代码:
library(jsonlite) # 修正后的API基础字符串 base_string1 <- "https.api.companyname/jurisdiction=" base_string2 <- "&date=" end_string <- "&api_token=XYZ" # 补上开头的& # 生成日期范围和对应的年月标签 dates <- seq(as.Date("1990-01-01"), as.Date("2022-01-01"), by = "month") date_ranges <- paste(head(dates, -1), tail(dates, -1) - 1, sep = ":") date_labels <- format(head(dates, -1), "%m-%Y") # 生成01-2018格式的日期标签 countries <- paste0("eu_", c("fra", "ger"))
2. 创建空数据框并通过循环填充结果
先初始化一个指定列类型的空数据框,避免循环中出现类型转换问题。然后修正嵌套循环的变量名和API字符串拼接顺序(你之前把国家和日期的位置搞反了,应该先指定jurisdiction参数,再指定date参数):
# 初始化空数据框 result_df <- data.frame( 国家名称 = character(), 日期 = character(), total_number = integer(), stringsAsFactors = FALSE ) # 嵌套循环遍历所有国家-日期组合 for (country in countries) { for (i in seq_along(date_ranges)) { # 拼接正确的API请求链接 api_string <- paste0(base_string1, country, base_string2, date_ranges[i], end_string) # 调用API并提取结果 json_response <- jsonlite::fromJSON(api_string) total_num <- json_response[["results"]]$total_number # 将当前结果添加到数据框(处理可能的空值情况) result_df <- rbind(result_df, data.frame( 国家名称 = ifelse(country == "eu_fra", "法国", "德国"), # 映射为真实国家名称 日期 = date_labels[i], total_number = ifelse(is.null(total_num), 0, total_num), # 空值替换为0 stringsAsFactors = FALSE )) } }
3. 更高效的替代方案:使用purrr批量处理
如果你的数据量较大,循环中反复rbind会影响效率,推荐用purrr的映射函数实现批量调用,代码更简洁且性能更好:
library(purrr) library(dplyr) # 生成所有国家-日期的组合列表 country_date_pairs <- expand.grid( country = countries, date_range = date_ranges, date_label = date_labels, stringsAsFactors = FALSE ) # 定义单个API调用的函数 get_total <- function(country, date_range) { api_string <- paste0(base_string1, country, base_string2, date_range, end_string) json_response <- jsonlite::fromJSON(api_string) return(json_response[["results"]]$total_number %||% 0) # %||% 是purrr的空值替换工具 } # 批量调用并生成最终数据框 result_df <- country_date_pairs %>% mutate( total_number = map2_dbl(country, date_range, get_total), 国家名称 = case_when( country == "eu_fra" ~ "法国", country == "eu_ger" ~ "德国" ) ) %>% select(国家名称, 日期 = date_label, total_number)
关键注意事项
- 记得处理API请求可能返回的空值,避免数据框出现缺失值
- 如果API有调用频率限制,建议在循环中加入
Sys.sleep(1)这样的延迟,防止被服务器封禁
内容的提问来源于stack exchange,提问作者PierreRoubaix
相关产品推荐
相关产品推荐

