2010-04-11 34 views
118

Czy istnieje sposób na import danych z pliku JSON do R? Dokładniej, plik jest tablicą obiektów JSON z polami łańcuchowymi, obiektami i tablicami. Pakiet RJSON nie jest bardzo jasne, jak sobie z tym poradzić http://cran.r-project.org/web/packages/rjson/rjson.pdf.Importowanie danych z pliku JSON do R

+3

Duplikat: http://stackoverflow.com/questions/2061897/parse-json-with-r. Jeśli masz konkretny przykład danych, to mogłoby to pomóc. W przeciwnym razie rjson może zrobić to, czego potrzebujesz, wraz z manipulacją danymi (np. Za pomocą funkcji apply lub plyr). – Shane

+0

Również podobne do tego pytania: http://stackoverflow.com/questions/2260147/transposing-json-list-of-dictionaries- for-analysis-in-r. – Shane

+0

Witaj Shane, próbowałeś używać RJSON. Interesuje mnie głównie niezbędna manipulacja danymi. Oto przykład pliku JSON, nad którym pracuję. przykład.json: [{"Zwycięzca": "68694999", "głosy": [{"ts": "Czw Mar 25 03:13:01 UTC 2010", "użytkownik": {"imię": "Lamur", "user_id": "68694999"}}, {"ts": "Czw Mar 25 03:13:08 UTC 2010", "user": {"name": "Lamur", "user_id": " 68694999 "}}]," lastVote ": {" timestamp ": 1269486788526," user ": {" name ":" Lamur "," user_id ":" 68694999 "}}," startPrice ": 0}, ... ] – user313967

Odpowiedz

139

Najpierw zainstaluj pakiet rjson:

install.packages("rjson") 

wówczas:

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

UPDATE: od wersji 0.2.1

json_data <- fromJSON(file=json_file) 
28

Alternatywą pakiet jest RJSONIO. Aby przekonwertować listę zagnieżdżoną, 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_id' powinno być teraz' x $ user ['name'], x $ user ['user_id'] '. Również 'm <- do.call (rbind, m)' może być lepszym sposobem na konwersję listy do macierzy. – jbaums

+1

dzięki za wskazanie tego, naprawiłem. –

+0

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

14

Jeżeli adres jest HTTPS, jak stosowane do Amazon S3, a następnie użyć getURL

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

PSA: getURL jest w pakiecie RCurl. –

+0

Również "Błąd w funkcji (typ, msg, asError = TRUE): Protokół" s3 "nie jest obsługiwany lub wyłączany w libcurl' – d8aninja

52

jsonlite importuje JSON w ramce danych. Może opcjonalnie spłaszczyć zagnieżdżone obiekty. Macierze 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 
+2

Podoba mi się ta odpowiedź i biblioteka bardziej niż akceptowana. –

0

Najpierw zainstaluj RJSONIO i RCurl pakiet:

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

Spróbuj poniżej kod za pomocą 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)

Powiązane problemy