10

データを使用して分析できるように、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 の構造は次のとおりです。

{
  "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 のスタートアップのリスト全体に適用する方法がわかりません。特に、ページネーションの処理方法がわかりません。スタートアップの 1 ページ (つまり 50 件) しか取得できないようです。

forループを使用してスタートアップのリストを取得し、各値をデータフレームの行に1つずつ入れてみました。以下の例では、これを 1 つの列についてのみ示していますが、もちろん、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 呼び出しを正しく構成する方法を理解できるかどうかを確認します。それがわかったら、この回答を更新します!

4

2 に答える 2

11

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ドキュメントのどこかにあると思います。

于 2015-05-02T05:22:10.557 に答える
6

httrライブラリは既にjsonliteをインポートしています( httr ドキュメント)。より適切にフォーマットされた出力を使用するよりエレガントな方法は次のとおりです。

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)
于 2016-09-21T12:55:25.347 に答える