成功将分页 JSON 对象强制转换为 R 数据框
Successfully coercing paginated JSON object to R dataframe
我正在尝试将从 API 中提取的 JSON 转换为 R 中的数据框,以便我可以使用和分析数据。
#Install needed packages
require(RJSONIO)
require(httr)
#request a list of companies currently fundraising using httr
r <- GET("https://api.angel.co/1/startups?filter=raising")
#convert to text object using httr
raise <- content(r, as="text")
#convert to list using RJSONIO
fromJSON(raise) -> new
一旦我得到这个对象,new
,我就很难将列表解析成数据框。 json 有 this structure:
{
"startups": [
{
"id": 6702,
"name": "AngelList",
"quality": 10,
"...": "...",
"fundraising": {
"round_opened_at": "2013-07-30",
"raising_amount": 1000000,
"pre_money_valuation": 2000000,
"discount": null,
"equity_basis": "equity",
"updated_at": "2013-07-30T08:14:40Z",
"raised_amount": 0.0
}
}
],
"total": 4268 ,
"per_page": 50,
"page": 1,
"last_page": 86
}
我尝试使用如下代码查看 new
中的各个元素:
new$startups[[1]]$fundraising$raised_amount
为列出的第一个元素拉取 raised_amount
。但是,我不知道如何将其应用于整个 4268 家初创公司列表。特别是,我不知道如何处理分页。我似乎只获得一页最多的初创公司(即其中的 50 个)。
我尝试使用 for 循环获取初创公司列表,然后将每个值一个一个地放入数据框的一行中。下面的示例仅针对一列显示了这一点,但当然我可以通过扩展 for 循环来对所有列执行此操作。但是,我无法在任何其他页面上获取任何内容。
df1 <- as.data.frame(1:length(new$startups))
df1$raiseamnt <- 0
for (i in 1:length(new$startups)) {
df1$raiseamnt[i] <- new$startups[[i]]$fundraising$raised_amount
}
e:感谢您提到分页。我会更仔细地查看文档,看看我是否可以弄清楚如何正确构造 API 调用以获取不同的页面。我会更新这个答案 if/when 我知道了!
您可能会发现 jsonlite 包很有用。下面是一个简单的例子。
library(jsonlite)
library(httr)
#request a list of companies currently fundraising using httr
r <- GET("https://api.angel.co/1/startups?filter=raising")
#convert to text object using httr
raise <- content(r, as="text")
#parse JSON
new <- fromJSON(raise)
head(new$startups$id)
[1] 229734 296470 237516 305916 184460 147385
但是请注意,这个包或问题中的那个包可以帮助解析 JSON 字符串,应该适当地创建单独的结构,以便可以毫无问题地添加字符串的每个元素并且它由开发者决定。
对于分页,API 似乎是一个 REST API,因此通常在 URL 中添加过滤条件(例如 https://api.angel.co/1/startups?filter=raising&variable=value
)。我想它会在 API 文档的某处找到。
httr 库已经导入 jsonlite (httr documentation)。具有更好格式输出的更优雅的方式是:
library(httr)
resp <- httr::GET("https://api.angel.co/1/startups?filter=raising", accept_json())
cont <- content(resp, as = "parsed", type = "application/json")
#explicit convertion to data frame
dataFrame <- data.frame(cont)
我正在尝试将从 API 中提取的 JSON 转换为 R 中的数据框,以便我可以使用和分析数据。
#Install needed packages
require(RJSONIO)
require(httr)
#request a list of companies currently fundraising using httr
r <- GET("https://api.angel.co/1/startups?filter=raising")
#convert to text object using httr
raise <- content(r, as="text")
#convert to list using RJSONIO
fromJSON(raise) -> new
一旦我得到这个对象,new
,我就很难将列表解析成数据框。 json 有 this structure:
{
"startups": [
{
"id": 6702,
"name": "AngelList",
"quality": 10,
"...": "...",
"fundraising": {
"round_opened_at": "2013-07-30",
"raising_amount": 1000000,
"pre_money_valuation": 2000000,
"discount": null,
"equity_basis": "equity",
"updated_at": "2013-07-30T08:14:40Z",
"raised_amount": 0.0
}
}
],
"total": 4268 ,
"per_page": 50,
"page": 1,
"last_page": 86
}
我尝试使用如下代码查看 new
中的各个元素:
new$startups[[1]]$fundraising$raised_amount
为列出的第一个元素拉取 raised_amount
。但是,我不知道如何将其应用于整个 4268 家初创公司列表。特别是,我不知道如何处理分页。我似乎只获得一页最多的初创公司(即其中的 50 个)。
我尝试使用 for 循环获取初创公司列表,然后将每个值一个一个地放入数据框的一行中。下面的示例仅针对一列显示了这一点,但当然我可以通过扩展 for 循环来对所有列执行此操作。但是,我无法在任何其他页面上获取任何内容。
df1 <- as.data.frame(1:length(new$startups))
df1$raiseamnt <- 0
for (i in 1:length(new$startups)) {
df1$raiseamnt[i] <- new$startups[[i]]$fundraising$raised_amount
}
e:感谢您提到分页。我会更仔细地查看文档,看看我是否可以弄清楚如何正确构造 API 调用以获取不同的页面。我会更新这个答案 if/when 我知道了!
您可能会发现 jsonlite 包很有用。下面是一个简单的例子。
library(jsonlite)
library(httr)
#request a list of companies currently fundraising using httr
r <- GET("https://api.angel.co/1/startups?filter=raising")
#convert to text object using httr
raise <- content(r, as="text")
#parse JSON
new <- fromJSON(raise)
head(new$startups$id)
[1] 229734 296470 237516 305916 184460 147385
但是请注意,这个包或问题中的那个包可以帮助解析 JSON 字符串,应该适当地创建单独的结构,以便可以毫无问题地添加字符串的每个元素并且它由开发者决定。
对于分页,API 似乎是一个 REST API,因此通常在 URL 中添加过滤条件(例如 https://api.angel.co/1/startups?filter=raising&variable=value
)。我想它会在 API 文档的某处找到。
httr 库已经导入 jsonlite (httr documentation)。具有更好格式输出的更优雅的方式是:
library(httr)
resp <- httr::GET("https://api.angel.co/1/startups?filter=raising", accept_json())
cont <- content(resp, as = "parsed", type = "application/json")
#explicit convertion to data frame
dataFrame <- data.frame(cont)