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 .
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 .
Câu trả lời:
Đầu tiên cài đặt rjson
gói:
install.packages("rjson")
Sau đó:
library("rjson")
json_file <- "http://api.worldbank.org/country?per_page=10®ion=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)
jsonlite
sẽ 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
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.
x$user$name, x$user$user_id
bâ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.
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'))
Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
Đầ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)
gói:
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'
.
library(httr)
url <- "http://www.omdbapi.com/?apikey=72bc447a&t=Annie+Hall&y=&plot=short&r=json"
resp <- GET(url)
content(resp, as = "text")
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.