下面的脚本从联合国的API中提取一些特定的国家数据。我创建了一个for循环来帮助用户从数据库中提取多个国家的情况。我正在努力解决的问题是在for循环之后,我从"data"元素在"response"向量(响应元数据)。我目前正在使用rbind()对多个列表进行分组,但希望找到一个解决方案来解释潜在的无限数量的列表,而不必手动写出每个列表。
library(jsonlite)
library(httr)
base_url <- "https://population.un.org/dataportalapi/api/v1/data"
locationlist <- list("528","40","620") # example list of country codes
target <- list()
response <- list()
for (i in locationlist) {
target[[i]] <- paste0(base_url, "/indicators/",65,"/locations/",i,"/start/",2000,"/end/",2019) # url
response[[i]] <- fromJSON(target[[i]]) # call API
}
# Here's the main issue :
df <- rbind(response[[1]]$data,response[[2]]$data,response[[3]]$data) # combine lists
我试过在for循环中加入rbind(),但没有成功。
每个response
元素都是一个list
,我们只需要提取data
元素。因此,循环response
(这是一个list
),使用[[
或$
来提取"数据"部分,它返回data.frame
s的list
,可以用do.call
对rbind
进行编辑
out <- do.call(rbind, lapply(response, `[[`, "data"))
与产出
> dim(out)
[1] 60 32
或者使用tidyverse
library(purrr) # version 1.0.0
library(dplyr)
out <- map(response, pluck, "data") %>%
list_rbind
#or may also use
out <- map_dfr(response, pluck, "data")
可以在lapply
或map
中完成,而不是在for
循环中执行此操作
library(stringr)
urls <- str_c(base_url, "/indicators/",65,"/locations/",
locationlist,"/start/",2000,"/end/",2019)
out <- map_dfr(urls, ~ fromJSON(.x) %>%
pluck("data"))
> dim(out)
[1] 60 32
out <- map(
)