Імпорт даних з файлу 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 може виконувати все, що вам потрібно, разом з маніпулюванням даними (наприклад, з функцією застосувати або plyr).
Шейн

Також подібне до цього питання: stackoverflow.com/questions/2260147/… .
Шейн

Привіт Шейн, спробував використовувати RJSON. Мене найбільше цікавлять необхідні маніпуляції з даними. Ось приклад файлу JSON, з яким я працюю. example.json: [{"переможця": "68694999", "голосів": [{"ts": "Чт 25 березня 03:13:01 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}}, {"ts": "Чт 25 березня 03:13:08 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}} ], "lastVote": {"timestamp": 1269486788526, "user": {"name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
користувач313967

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. Оновлення змінює останній рядок попереднього прикладу, і вам все одно потрібно завантажити в бібліотеку, як зазначено вище.
Стівен Уотерман

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)?
користувачJT

16

Якщо URL-адреса є https, як для Amazon S3, використовуйте 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

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.

У такому форматі потрібно легко перетворити його на кілька .csvs, якщо потрібно.

Важливою частиною є змістова функція, яку має мати 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)

Роздрукувати вміст відповідної тексту як текст

content(resp, as = "text")

Роздрукувати вміст респ

content(resp)

Використовуйте content (), щоб отримати вміст resp, але цього разу не вказуйте другий аргумент. R автоматично визначає, що ви маєте справу з JSON, і перетворює JSON у названий R список.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.