JSONファイルからRへのデータのインポート


166

JSONファイルからRにデータをインポートする方法はありますか?より具体的には、ファイルは、文字列フィールド、オブジェクト、および配列を含むJSONオブジェクトの配列です。RJSONパッケージは、このhttp://cran.r-project.org/web/packages/rjson/rjson.pdfへの対処方法についてあまり明確ではありません。


3
複製:stackoverflow.com/questions/2061897/parse-json-with-r。特定のデータ例がある場合は、それが役立ちます。それ以外の場合、rjsonはデータ操作(たとえば、apply関数またはplyr)とともに、必要なことを実行できます。
シェーン

また、この質問に似ています:stackoverflow.com/questions/2260147/…
シェーン

こんにちはシェーン、RJSONを使用してみました。私は主に必要なデータ操作に興味があります。以下は、使用しているJSONファイルの例です。example.json:[{"winner": "68694999"、 "votes":[{"ts": "Thu Mar 25 03:13:01 UTC 2010"、 "user":{"name": "Lamur"、 "user_id": "68694999"}}、{"ts": "Thu Mar 25 03:13:08 UTC 2010"、 "user":{"name": "Lamur"、 "user_id": "68694999"}} ]、 "lastVote":{"timestamp":1269486788526、 "user":{"name": "Lamur"、 "user_id": "68694999"}}、 "startPrice":0}、...]
user313967

1
注意:JSONファイルが本当に大きい場合、明らかに.soまたは.dllライブラリはそれを処理しません。好ましい形式はNetCDFですが、組織によってはこの問題を認識していません。

回答:


187

最初にrjsonパッケージをインストールします。

install.packages("rjson")

次に:

library("rjson")
json_file <- "http://api.worldbank.org/country?per_page=10&region=OED&lendingtype=LNX&format=json"
json_data <- fromJSON(paste(readLines(json_file), collapse=""))

更新:バージョン0.2.1以降

json_data <- fromJSON(file=json_file)

1
編集はRではなくライブラリの更新を参照していることに注意してください。更新は前の例の最後の行を変更しますが、上記のようにライブラリにロードする必要があります。
Steven Waterman

90

jsonliteJSONをデータフレームにインポートします。ネストされたオブジェクトをオプションでフラット化できます。ネストされた配列はデータフレームになります。

> library(jsonlite)
> winners <- fromJSON("winners.json", flatten=TRUE)
> colnames(winners)
[1] "winner" "votes" "startPrice" "lastVote.timestamp" "lastVote.user.name" "lastVote.user.user_id"
> winners[,c("winner","startPrice","lastVote.user.name")]
    winner startPrice lastVote.user.name
1 68694999          0              Lamur
> winners[,c("votes")]
[[1]]
                            ts user.name user.user_id
1 Thu Mar 25 03:13:01 UTC 2010     Lamur     68694999
2 Thu Mar 25 03:13:08 UTC 2010     Lamur     68694999

絶対に!結果をフィルタリングするときに、リストの代わりにdata.framesを使用するほうが本当に簡単です!
MSベレンド

31

代替パッケージはRJSONIOです。ネストされたリストを変換するには、lapplyが役立ちます。

l <- fromJSON('[{"winner":"68694999",  "votes":[ 
   {"ts":"Thu Mar 25 03:13:01 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}},   
   {"ts":"Thu Mar 25 03:13:08 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}}],   
  "lastVote":{"timestamp":1269486788526,"user":
   {"name":"Lamur","user_id":"68694999"}},"startPrice":0}]'
)
m <- lapply(
    l[[1]]$votes, 
    function(x) c(x$user['name'], x$user['user_id'], x['ts'])
)
m <- do.call(rbind, m)

あなたの例の投票に関する情報を提供します。


1
x$user$name, x$user$user_idこれでになるはずx$user['name'], x$user['user_id']です。また、m <- do.call(rbind, m)リストを行列に変換するより良い方法かもしれません。
jbaums 2013年

JSONのconvertToDataFrame関数のようなもの(XMLパッケージのようなもの)はありますか?
userJT 2015

16

Amazon S3で使用されているように、URLがhttpsの場合は、getURLを使用します。

json <- fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json'))

11
PSA:getURLはRCurlパッケージにあります。
マークマクドナルド

1
また、Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
d8aninja 2017

3

最初にRJSONIOおよびRCurlパッケージをインストールします。

install.packages("RJSONIO")
install.packages("(RCurl")

コンソールでRJSONIOを使用して以下のコードを試してください

library(RJSONIO)
library(RCurl)
json_file = getURL("https://raw.githubusercontent.com/isrini/SI_IS607/master/books.json")
json_file2 = RJSONIO::fromJSON(json_file)
head(json_file2)


2

パッケージ:

  • ライブラリ(httr)
  • ライブラリ(jsonlite)

jsonをdataframe / csvに変換する際に問題が発生しました。私の場合、私はしました:

Token <- "245432532532"
source <- "http://......."
header_type <- "applcation/json"
full_token <- paste0("Bearer ", Token)
response <- GET(n_source, add_headers(Authorization = full_token, Accept = h_type), timeout(120), verbose())
text_json <- content(response, type = 'text', encoding = "UTF-8")
jfile <- fromJSON(text_json)
df <- as.data.frame(jfile)

それからdfからcsvへ。

この形式では、必要に応じて複数の.csvに簡単に変換できます。

重要な部分は、コンテンツ関数が持つべきtype = 'text'です。


1

httrパッケージをインポートする

library(httr)

URLを取得

url <- "http://www.omdbapi.com/?apikey=72bc447a&t=Annie+Hall&y=&plot=short&r=json"
resp <- GET(url)

respの内容をテキストとして印刷

content(resp, as = "text")

応答の内容を印刷する

content(resp)

content()を使用してrespのコンテンツを取得しますが、今回は2番目の引数を指定しません。Rは、JSONを処理していることを自動的に判断し、JSONを名前付きRリストに変換します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.