Bir JSON dosyasından R'ye veri aktarma


166

Bir JSON dosyasından R'ye veri almanın bir yolu var mı? Daha spesifik olarak, dosya, dize alanları, nesneler ve diziler içeren bir JSON nesneleri dizisidir. RJSON Paketi, bu http://cran.r-project.org/web/packages/rjson/rjson.pdf ile nasıl başa çıkılacağı konusunda net değildir .


3
Kopya: stackoverflow.com/questions/2061897/parse-json-with-r . Belirli bir veri örneğiniz varsa, bu yardımcı olacaktır. Aksi takdirde rjson, veri manipülasyonu ile birlikte ihtiyacınız olanı yapabilir (örn. Bir uygulama fonksiyonu veya plyr ile).
Shane


Merhaba Shane, RJSON kullanmayı denedi. Çoğunlukla gerekli veri manipülasyonu ile ilgileniyorum. İşte birlikte çalıştığım bir JSON dosyası örneği. example.json: [{"kazanan": "68694999", "oy": [{"ts": "Per Mar 25 03:13:01 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}}, {"ts": "Per Mar 25 03:13:08 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}} ], "lastVote": {"timestamp": 1269486788526, "user": {"name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
kullanıcı313967

1
Dikkat: JSON dosyası gerçekten büyükse, görünüşe göre .so veya .dll kitaplıkları bunu işlemez. Tercih edilen bir biçim NetCDF'dir, ancak bazı kuruluşlar bu sorunun farkında değildir.

Yanıtlar:


187

İlk önce rjsonpaketi kurun :

install.packages("rjson")

Sonra:

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

Güncelleme: 0.2.1 sürümünden beri

json_data <- fromJSON(file=json_file)

1
Düzenlemenin, R'ye değil kütüphaneye yönelik bir güncellemeye atıfta bulunduğunu unutmayın. Güncelleme, önceki örneğin son satırını değiştirir ve yine de yukarıdaki gibi kütüphaneye yüklemeniz gerekir.
Steven Waterman

90

jsonliteJSON'u bir veri çerçevesine içe aktarır. İsteğe bağlı olarak iç içe geçmiş nesneleri düzleştirebilir. İç içe diziler veri çerçeveleri olacaktır.

> 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

Kesinlikle! Sonuçları filtrelerken listeler yerine data.frames ile çalışmak gerçekten daha kolay!
MS Berends

31

Alternatif bir paket RJSONIO'dur. Yuvalanmış bir listeyi dönüştürmek için lapply yardımcı olabilir:

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)

örneğinizdeki oylar hakkında bilgi verir.


1
x$user$name, x$user$user_idşimdi olmalı x$user['name'], x$user['user_id']. Ayrıca, m <- do.call(rbind, m)listeyi bir matrise dönüştürmenin daha iyi bir yolu olabilir.
jbaums

JSON için convertToDataFrame işlevi gibi bir şey var mı (XML paketi için olduğu gibi)?
userJT

16

URL, Amazon S3 için kullanıldığı gibi https ise, getURL kullanın

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

11
PSA: getURL RCurl paketinde.
Mark McDonald

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

3

Önce RJSONIO ve RCurl paketini kurun:

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

Konsolda RJSONIO kullanarak aşağıdaki kodu deneyin

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

paketleri:

  • kitaplığı (HTTR)
  • kitaplığı (jsonlite)

Ben json dataframe / csv dönüştürme sorunları yaşadım. Benim durumum için yaptı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)

sonra df'den csv'ye.

Bu formatta gerektiğinde birden çok .csvs dosyasına dönüştürmek kolay olmalıdır.

Önemli olan içerik fonksiyonunun olması gerektiğidir type = 'text'.


1

httr paketini içe aktar

library(httr)

URL'yi al

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

Resp içeriğini metin olarak yazdır

content(resp, as = "text")

Resp içeriği yazdırın

content(resp)

Resp içeriğini almak için content () kullanın, ancak bu kez ikinci bir argüman belirtmeyin. R, bir JSON ile uğraştığınızı otomatik olarak bulur ve JSON'u adlandırılmış bir R listesine dönüştürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.