Importowanie danych z pliku JSON do R


166

Czy istnieje sposób na zaimportowanie danych z pliku JSON do R? Mówiąc dokładniej, plik jest tablicą obiektów JSON z polami łańcuchowymi, obiektami i tablicami. Pakiet RJSON nie jest zbyt jasny, jak radzić sobie z tym http://cran.r-project.org/web/packages/rjson/rjson.pdf .


3
Duplikat: stackoverflow.com/questions/2061897/parse-json-with-r . Jeśli masz konkretny przykład danych, to by pomogło. W przeciwnym razie rjson może zrobić to, czego potrzebujesz, wraz z manipulacją danymi (np. Za pomocą funkcji Apply lub Plyr).
Shane

Również podobne do tego pytania: stackoverflow.com/questions/2260147/… .
Shane

Cześć Shane, próbowałem użyć RJSON. Interesuje mnie przede wszystkim niezbędna manipulacja danymi. Oto przykład pliku JSON, z którym pracuję. example.json: [{"zwycięzca": "68694999", "głosy": [{"ts": "Czwartek, 25 marca 03:13:01 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}}, {"ts": "Thu 25 marca 03:13:08 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}} ], "lastVote": {"timestamp": 1269486788526, "user": {"name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
user313967

1
Uwaga: jeśli plik JSON jest naprawdę duży, najwyraźniej biblioteki .so lub .dll go nie przetworzą. Preferowanym formatem jest NetCDF, ale niektóre organizacje nie są świadome tego problemu.

Odpowiedzi:


187

Najpierw zainstaluj rjsonpakiet:

install.packages("rjson")

Następnie:

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

Aktualizacja: od wersji 0.2.1

json_data <- fromJSON(file=json_file)

1
Zwróć uwagę, że edycja odnosi się do aktualizacji biblioteki, a nie R. Aktualizacja zmienia ostatnią linię poprzedniego przykładu i nadal musisz załadować bibliotekę, jak powyżej.
Steven Waterman

90

jsonlitezaimportuje JSON do ramki danych. Opcjonalnie może spłaszczyć zagnieżdżone obiekty. Tablice zagnieżdżone będą ramkami danych.

> 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

Absolutnie! Naprawdę łatwiej jest pracować z data.frames zamiast list podczas filtrowania wyników!
MS Berends

31

Alternatywnym pakietem jest RJSONIO. Aby przekonwertować zagnieżdżoną listę, lapply może pomóc:

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)

podaje informacje na temat głosów w Twoim przykładzie.


1
x$user$name, x$user$user_idpowinno być teraz x$user['name'], x$user['user_id']. Ponadto m <- do.call(rbind, m)może być lepszym sposobem konwersji listy na macierz.
jbaums

czy jest coś takiego jak funkcja convertToDataFrame dla JSON (tak jak w przypadku pakietu XML)?
userJT

16

Jeśli adres URL to https, tak jak w przypadku Amazon S3, użyj getURL

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

11
PSA: getURL znajduje się w pakiecie RCurl.
Mark McDonald

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

3

Najpierw zainstaluj pakiet RJSONIO i RCurl:

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

Wypróbuj poniższy kod używając RJSONIO w konsoli

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

pakiety:

  • biblioteka (httr)
  • biblioteka (jsonlite)

Miałem problemy z konwersją json do dataframe / csv. W moim przypadku zrobiłem:

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)

następnie z df do csv.

W tym formacie w razie potrzeby można łatwo przekonwertować go na wiele plików .csv.

Ważną częścią jest funkcja treści, którą powinna mieć type = 'text'.


1

import pakietu httr

library(httr)

Uzyskaj adres URL

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

Wydrukuj treść lub jako tekst

content(resp, as = "text")

Wydrukuj treść resp

content(resp)

Użyj content (), aby uzyskać zawartość resp, ale tym razem nie określaj drugiego argumentu. R automatycznie wykrywa, że ​​masz do czynienia z plikiem JSON, i konwertuje go na nazwaną listę R.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.