如何修复R语言中‘Error: arguments imply differing number of rows’错误?
问题分析与解决方案
错误根源
- API响应结构不一致:部分议员的详情API返回包含嵌套数组(比如任职记录、委员会成员资格),转成data.frame时会生成多行数据,导致每次循环生成的数据框行数/列数不统一,触发行数不匹配错误。
- 未累积结果:当前循环只是每次覆盖单个变量,没有把所有请求结果存储起来,完全达不到批量获取数据的目的。
- 硬编码循环次数:直接写死
531不够灵活,应该用议员ID列表的实际长度来控制循环。
修正后的脚本
install.packages(c("jsonlite", "httr")) library(jsonlite) library(httr) # 第一次请求获取议员列表 url_deputados <- "https://dadosabertos.camara.leg.br/api/v2/deputados?idLegislatura=57&ordem=ASC&ordenarPor=nome" get_deputados <- GET(url_deputados) deputados_text <- content(get_deputados, "text") deputados_json <- fromJSON(deputados_text, flatten = TRUE) deputados_df <- as.data.frame(deputados_json) deputados_df <- deputados_df[1:9] # 准备详情请求的基础配置 url_base <- "https://dadosabertos.camara.leg.br/api/v2/" url_deputados_path <- "deputados/" id_list <- deputados_df$dados.id # 初始化列表存储所有议员详情(列表能容纳不同结构的数据,避免行数不匹配) deputados_details <- list() # 循环请求每个议员的详情 for (i in seq_along(id_list)) { cat("正在获取第", i, "个议员的详情...\n") # 构建请求URL request_url <- paste0(url_base, url_deputados_path, id_list[i]) # 发送请求 response <- GET(request_url) # 检查请求是否成功,失败则跳过并记录警告 if (http_status(response)$category != "Success") { warning(paste("ID", id_list[i], "请求失败:", http_status(response)$message)) deputados_details[[i]] <- NULL next } # 解析响应并存入列表 response_text <- content(response, "text") response_json <- fromJSON(response_text, flatten = TRUE) deputados_details[[i]] <- as.data.frame(response_json) } # 可选:如果需要合并成单个数据框(处理结构不一致的情况需用rbind.fill) # install.packages("plyr") # library(plyr) # deputados_details_df <- plyr::rbind.fill(deputados_details)
核心改进点
- 用列表存结果:列表可以容纳行数/列数不同的数据框,避免直接合并时的行数不匹配问题。
- 增加请求校验:处理API请求失败的情况,防止脚本中途中断。
- 动态控制循环:用
seq_along(id_list)替代硬编码的数字,适配实际的议员数量。 - 灵活合并方案:如果需要统一成单个数据框,用
plyr::rbind.fill可以自动填充缺失列,兼容结构不一致的响应。
内容的提问来源于stack exchange,提问作者Gabriel Pace
相关产品推荐
相关产品推荐

