Nhập dữ liệu từ tệp JSON vào R


166

Có cách nào để nhập dữ liệu từ tệp JSON vào R không? Cụ thể hơn, tệp là một mảng các đối tượng JSON với các trường chuỗi, đối tượng và mảng. Gói RJSON không rõ ràng về cách đối phó với http://cran.r-project.org/web/packages/rjson/rjson.pdf này .


3
Sao y: stackoverflow.com/questions/2061897/parse-json-with-r . Nếu bạn có một ví dụ dữ liệu cụ thể, điều đó sẽ giúp ích. Mặt khác, rjson có thể làm những gì bạn cần, cùng với thao tác dữ liệu (ví dụ với hàm áp dụng hoặc plyr).
Shane

Cũng tương tự với câu hỏi này: stackoverflow.com/questions/2260147/ .
Shane

Xin chào Shane, đã thử sử dụng RJSON. Tôi quan tâm chủ yếu đến các thao tác dữ liệu cần thiết. Đây là một ví dụ về tệp JSON tôi đang làm việc. example.json: [{"người chiến thắng": "68694999", "phiếu bầu": [{"ts": "Thu Mar 25 03:13:01 UTC 2010", "người dùng": {"tên": "Lamur", "user_id": "68694999"}}, {"ts": "Thu Mar 25 03:13:08 UTC 2010", "người dùng": {"name": "Lamur", "user_id": "68694999"}} ], "lastVote": { "dấu thời gian": 1269486788526, "người sử dụng": { "tên": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
user313967

1
Lưu ý: Nếu tệp JSON thực sự lớn, rõ ràng các thư viện .so hoặc dll sẽ không xử lý nó. Một định dạng thích hợp hơn là NetCDF, nhưng một số tổ chức không biết về vấn đề này.

Câu trả lời:


187

Đầu tiên cài đặt rjsongói:

install.packages("rjson")

Sau đó:

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=""))

Cập nhật: kể từ phiên bản 0.2.1

json_data <- fromJSON(file=json_file)

1
Lưu ý rằng bản chỉnh sửa đề cập đến một bản cập nhật cho thư viện, chứ không phải R. Bản cập nhật thay đổi dòng cuối cùng của ví dụ trước và bạn vẫn cần tải trong thư viện như trên.
Steven Waterman

90

jsonlitesẽ nhập JSON vào khung dữ liệu. Nó có thể tùy ý làm phẳng các đối tượng lồng nhau. Mảng lồng nhau sẽ là khung dữ liệu.

> 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

Chắc chắn rồi! Thực sự dễ dàng hơn để làm việc với data.frames thay vì danh sách khi lọc kết quả!
MS Berends

31

Một gói thay thế là RJSONIO. Để chuyển đổi một danh sách lồng nhau, lapply có thể giúp:

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)

cung cấp thông tin về số phiếu trong ví dụ của bạn.


1
x$user$name, x$user$user_idbây giờ sẽ được x$user['name'], x$user['user_id']. Ngoài ra, m <- do.call(rbind, m)có thể là một cách tốt hơn để chuyển đổi danh sách thành ma trận.
jbaums

có cái gì đó giống như hàm convertToDataFrame cho JSON (giống như có gói XML) không?
userJT

16

Nếu URL là https, như được sử dụng cho Amazon S3, thì hãy sử dụng getURL

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

11
PSA: getURL nằm trong nhịp điệu RCurl.
Đánh dấu McDonald

1
Ngoài ra,Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
d8aninja

3

Đầu tiên cài đặt gói RJSONIO và RCurl:

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

Hãy thử mã bên dưới bằng cách sử dụng RJSONIO trong bảng điều khiển

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

gói:

  • thư viện (omer)
  • thư viện (jsonlite)

Tôi đã gặp sự cố khi chuyển json sang dataframe / csv. Đối với trường hợp của tôi, tôi đã làm:

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)

sau đó từ df đến csv.

Trong định dạng này, thật dễ dàng để chuyển đổi nó thành nhiều .csvs nếu cần.

Phần quan trọng là chức năng nội dung nên có type = 'text'.


1

nhập khẩu góir

library(httr)

Nhận url

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

In nội dung của resp như văn bản

content(resp, as = "text")

In nội dung của resp

content(resp)

Sử dụng nội dung () để lấy nội dung tương ứng, nhưng lần này không chỉ định đối số thứ hai. R tự động nhận ra rằng bạn đang xử lý JSON và chuyển đổi JSON thành danh sách R có tên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.