【问题标题】:Successfully coercing paginated JSON object to R dataframe成功将分页的 JSON 对象强制转换为 R 数据框
【发布时间】:2015-05-02 01:19:23
【问题描述】:

我正在尝试将从 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 调用以获取不同的页面。如果/当我弄清楚时,我会更新这个答案!

【问题讨论】:

  • 来自他们的 API 文档:“您可以提供 pageper_page 参数来控制分页”。你需要什么领域?如果您不需要具有包含 data.frames 或列表的列的数据框,则可以简化您找到的数据框。
  • 我确实需要带有数据框和列表的列。我认为误读 api 文档是我最大的问题——我将研究如何正确获取页面。

标签: r httr jsonlite


【解决方案1】:

您可能会发现 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&amp;variable=value)。我想它会在 API 文档的某个地方找到。

【讨论】:

  • 怎么样:jsonlite::fromJSON(url)
【解决方案2】:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2011-06-21
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多