2010-04-11 183 views
118

有沒有辦法將數據從JSON文件導入到R?更具體地說,該文件是包含字符串字段,對象和數組的JSON對象的數組。 RJSON軟件包不清楚如何處理http://cran.r-project.org/web/packages/rjson/rjson.pdf從JSON文件導入數據到R

+3

Duplicate:http://stackoverflow.com/questions/2061897/parse-json-with-r。如果你有一個特定的數據例子,這將有所幫助。否則,rjson可以做你所需要的,以及數據操作(例如使用apply函數或plyr)。 – Shane 2010-04-11 16:37:37

+0

也類似於這個問題:http://stackoverflow.com/questions/2260147/transposing-json-list-of-dictionaries-for-analysis-in-r。 – Shane 2010-04-11 16:39:16

+0

嗨謝恩,嘗試使用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 「:{」 時間戳 「:1269486788526,」 用戶 「:{」 名稱 「:」 Lamur」, 「USER_ID」: 「68694999」}}, 「startPrice」:0},... ] – user313967 2010-04-11 17:01:37

回答

139

首先安裝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) 
28

另一種包裝是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-10-10 01:16:54

+1

感謝您指出這一點,修復它。 – 2013-10-10 12:18:47

+0

是否有類似JSON的convertToDataFrame函數(就像XML包一樣)? – userJT 2015-04-30 21:49:02

14

如果URL是HTTPS,像用於亞馬遜S3中,然後用的getURL

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

PSA:getURL在RCurl pacakge中。 – 2015-03-05 04:57:52

+0

此外,函數中的錯誤(type,msg,asError = TRUE): 協議「s3」在libcurl中不受支持或禁用 – d8aninja 2017-08-30 19:05:43

52

jsonlite將導入到JSON的數據幀。它可以選擇性地平整嵌套對象。嵌套數組將是數據框架。

> 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 
+2

我喜歡這個答案和庫比接受的更多 – 2016-03-06 05:58:12

0

首先安裝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)