问题描述
我有一个包含两列的 df:id 和 url。 id 包含项目 id,url 包含网站链接,我想用它来抓取父项目的 id。这是我拥有的 df 示例:
这是一个示例 df:
df <- structure(list(id = c("P173165","P175875","P175841","P175730"
),url = c("https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en","https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175875&apilang=en","https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175841&apilang=en","https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175730&apilang=en"
)),row.names = c(NA,-4L),class = c("data.table","data.frame"))
> df
id url
1: P173165 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en
2: P175875 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175875&apilang=en
3: P175841 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175841&apilang=en
4: P175730 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175730&apilang=en
@Sirius 建议我可以使用以下代码抓取父项目 ID:
library(jsonlite)
#let's do an example for row 1
json_data <- fromJSON("https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en")
json_data$projects[["P173165"]]$parentprojid
如你所见,我从第一行输入了 url;然后我从第一行输入 id。此代码输出父项目 ID:
[1] "P147665"
我想编写一个代码来自动化这个过程,并创建一个包含父项目 ID 的向量。然后我会将这个向量作为第三列分配给我的 df。这就是我想要实现的:
id url par_proj_id
1: P173165 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en P147665
2: P175875 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175875&apilang=en P173883
3: P175841 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175841&apilang=en P170267
4: P175730 https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175730&apilang=en P173799
我想我应该在这里使用 for 循环,但我不确定如何使用。有任何想法吗?非常感谢您的帮助。
解决方法
可以将请求放入一个函数中,然后使用purrr中的map2传入子id和url。与使用 for 循环相比,这应该更高效、更简洁。
library(magrittr)
library(jsonlite)
library(purrr)
get_parent_id <- function(child_id,url){
json_data <- jsonlite::fromJSON(url)
return(json_data$projects[[child_id]]$parentprojid)
}
df <- structure(list(id = c("P173165","P175875","P175841","P175730"
),url = c("https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P173165&apilang=en","https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175875&apilang=en","https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175841&apilang=en","https://search.worldbank.org/api/v2/projects?format=json&fl=*&id=P175730&apilang=en"
)),row.names = c(NA,-4L),class = c("data.table","data.frame"))
df$par_proj_id <- purrr::map2(df$id,df$url,get_parent_id)