将数据从JSON文件导入R


166

有没有办法将数据从JSON文件导入R?更具体地说,该文件是带有字符串字段,对象和数组的JSON对象的数组。关于如何处理此http://cran.r-project.org/web/packages/rjson/rjson.pdf,RJSON软件包尚不清楚。


3
重复:stackoverflow.com/questions/2061897/parse-json-with-r。如果您有特定的数据示例,那将有所帮助。否则,rjson可以满足您的需要,并可以进行数据操作(例如,使用apply函数或plyr)。
Shane 2010年


嗨,Shane,尝试使用RJSON。我主要对必要的数据操作感兴趣。这是我正在使用的JSON文件的示例。example.json:[{“ winner”:“ 68694999”,“ votes”:[{“ ts”:“ UTC 2010年3月25日03:13:01”,“ user”:{“ name”:“ Lamur”, “ user_id”:“ 68694999”}},{“ ts”:“ UTC 2010年3月25日星期三03:13:08”,“ user”:{“ name”:“ Lamur”,“ user_id”:“ 68694999”}} ],“ lastVote”:{“ timestamp”:1269486788526,“ user”:{“ name”:“ Lamur”,“ user_id”:“ 68694999”}},“ startPrice”:0},...]
user313967

1
注意:如果JSON文件确实很大,显然.so或.dll库将不会处理它。首选格式是NetCDF,但是某些组织不了解此问题。

Answers:


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的更新。此更新更改了上一示例的最后一行,您仍然需要如上所述加载库。
史蒂文·沃特曼

90

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

绝对!过滤结果时,使用data.frames而不是列表确实更容易!
MS Berends

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

是否有类似convertToDataFrame的JSON函数(例如XML包)?
userJT

16

如果URL是https(如用于Amazon S3的URL),则使用getURL

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

11
PSA:getURL在RCurl封装中。
Mark McDonald

1
此外,Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
d8aninja

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

将resp的内容打印为文本

content(resp, as = "text")

打印resp的内容

content(resp)

使用content()获取resp的内容,但是这次不指定第二个参数。R自动确定您正在处理JSON,并将JSON转换为命名的R列表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.