2015-11-07 11 views
0

У меня есть JSON, который выглядит следующим образом:Как читать вложенную структуру JSON в R?

"total_rows":141,"offset":0,"rows":[ 
{"id":"1","key":"a","value":{"SP$Sale_Price":"240000","CONTRACTDATE$Contract_Date":"2006-10-26T05:00:00"}}, 
{"id":"2","key":"b","value":{"SP$Sale_Price":"2000000","CONTRACTDATE$Contract_Date":"2006-08-22T05:00:00"}}, 
{"id":"3","key":"c","value":{"SP$Sale_Price":"780000","CONTRACTDATE$Contract_Date":"2007-01-18T06:00:00"}}, 
... 

В R, что было бы самым простым способом, чтобы получить разброс-график SP$Sale_Price против CONTRACTDATE$Contract_Date?

Я получил это далеко:

install.packages("rjson") 
library("rjson") 
json_file <- "http://localhost:5984/testdb/_design/sold/_view/sold?limit=100" 
json_data <- fromJSON(file=json_file) 
install.packages("plyr") 
library(plyr) 
asFrame <- do.call("rbind.fill", lapply(json_data, as.data.frame)) 

, но теперь я застрял ...

> plot(CONTRACTDATE$Contract_Date, SP$Sale_Price) 
Error in plot(CONTRACTDATE$Contract_Date, SP$Sale_Price) : 
    object 'CONTRACTDATE' not found 

Как сделать эту работу?

+0

ошибки не получают гораздо понятнее, чем 'объект«CON TRACTDATE 'not found' – rawr

ответ

2

Предположим, у вас есть следующий JSON-файл:

txt <- '{"total_rows":141,"offset":0,"rows":[ 
    {"id":"1","key":"a","value":{"SP$Sale_Price":"240000","CONTRACTDATE$Contract_Date":"2006-10-26T05:00:00"}}, 
    {"id":"2","key":"b","value":{"SP$Sale_Price":"2000000","CONTRACTDATE$Contract_Date":"2006-08-22T05:00:00"}}, 
    {"id":"3","key":"c","value":{"SP$Sale_Price":"780000","CONTRACTDATE$Contract_Date":"2007-01-18T06:00:00"}}]}' 

Тогда вы можете прочитать его следующим образом с jsonlite пакета:

library(jsonlite) 
json_data <- fromJSON(txt, flatten = TRUE) 

# get the needed dataframe 
dat <- json_data$rows 
# set convenient names for the columns 
# this step is optional, it just gives you nicer columnnames 
names(dat) <- c("id","key","sale_price","contract_date") 
# convert the 'contract_date' column to a datetime format 
dat$contract_date <- strptime(dat$contract_date, format="%Y-%m-%dT%H:%M:%S", tz="GMT") 

Теперь вы можете участок:

plot(dat$contract_date, dat$sale_price) 

Что дает:

enter image description here


Если вы решили не выравнивать JSON, вы можете сделать:

json_data <- fromJSON(txt) 

dat <- json_data$rows$value 

sp <- strtoi(dat$`SP$Sale_Price`) 
cd <- strptime(dat$`CONTRACTDATE$Contract_Date`, format="%Y-%m-%dT%H:%M:%S", tz="GMT") 
plot(cd,sp) 

Что дает один и тот же сюжет:

enter image description here

+0

Отлично, спасибо! Я немного разочарован тем, что уплощение сбрасывает имена полей. У меня есть 700 атрибутов в моих реальных данных json. Есть ли способ сохранить имена атрибутов? –

+0

@AlexR Сглаживание не отменяет имена полей. Посмотрите на структуру 'json_data'. Вы увидите, что перед именами полей добавляется 'value.'. Шаг об установке имен 'dat' необязателен и, таким образом, необязателен. См. Обновление. – Jaap

0

Я нашел способ, не содержит названия полей:

install.packages("jsonlite") 
install.packages("curl") 
json <- fromJSON(json_file) 
r <- json$rows 

На данный момент r выглядит следующим образом:

> class(r) 
[1] "data.frame" 
> colnames(r) 
[1] "id" "key" "value" 

После некоторых более погуглить и методом проб и ошибок я высадился на этом:

f <- r$value 
sp <- strtoi(f[["SP$Sale_Price"]]) 
cd <- strptime(f[["CONTRACTDATE$Contract_Date"]], format="%Y-%m-%dT%H:%M:%S", tz="GMT") 
plot(cd,sp) 

И результат на моей полной набор данных ...

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^