2015-07-01 6 views
0

Я хочу создать JSON данные формыСоздания данных в формате JSON через кадры данных в R

{"Recipe Name": "ABC", 
"Main Ingredient": "xyz", 
"Ingredients": {type:"a" 
       id:"1"}, 
       {type:"b" 
       id:"2"}, 
       {type:"b" 
       id:"3"} 
"Servings": 3,} 

у меня есть кадр данных типа:

Recipe, Recipe Id ,Ingredients,Ingredients ID,Servings ,Main Ingredient,Main Ingredient ID 
"abc" , 2  , {"a","b","c"} , {1,2,3,} , 5 , "f" ,7 
    "bcf" , 3 ,  {"d","e","f"} , {4,5,7} , 4 ,"g" ,8 
    .... 

Я попробовал пакет rjson usign но получил характер (0) в качестве результата. Может ли кто-нибудь помочь мне с этим, пожалуйста?

Я нашел один метод, хотя

>library(RJSONIO) 
>toJSON(dataframe) 

Вот результат:

[1] "{\ п \" factor1 \ ": [\" 115г \ "\" 1 \ ", null, null], \ n \" unit1 \ ": [\" tub \ ", \" cups \ ", \" Greek \ ", \" baby \ "], \ n \" item1 \ " : [\ "томаты NA \", \ "каламата оливки \", \ "брынза \", \ "ракета NA \"] \ п}»

Который не в требуемом формате

+1

ли вы в буквальном смысле есть строка '{ "D", "E", "F"}' хранятся в вашем data.frame? Это поможет, если вы предоставили [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) (возможно, 'dput()', если ваш входной кадр данных, чтобы дать понять, с чем вы работаете). Какой код вы пытались запустить, что дало вам символ (0) '? – MrFlick

+0

Где находится главный ингредиент в вашем R-файле? – Shiva

+0

@MrFlick Да, у меня эти укусы в моем кадре данных. Не могли бы вы мне помочь? – user459

ответ

0

Ваш желаемый результат не правильно структурирован: вам не хватает каких-либо запятых (минор), а ваш Ingredients должен быть явным списком (используя [ и ], ничего неявное разрешено). Кроме того, R действительно не любит пробелы в именах столбцов, поэтому я удалил их. Реструктурированная выход:

{"RecipeName": "ABC", 
"MainIngredient": "xyz", 
"Ingredients": [{"type":"a", "id":"1"}, 
       {"type":"b", "id":"2"}, 
       {"type":"b", "id":"3"}], 
"Servings": 3} 

Поскольку ваш data.frame например немного трудно читать/разобрана, вот один, который достаточно похож, я думаю:

dat <- data.frame(
    RecipeName=c('ABC', 'DEF'), 
    MainIngredient=c('xyz', 'lmn'), 
    Ingredients=c('{"a","b","c"}', '{"d","e","f"}'), 
    IngredientsId=c('{1,2,3}', '{4,5,6}'), 
    Servings=c(7,8), 
    stringsAsFactors=FALSE 
) 
dat 
## RecipeName MainIngredient Ingredients IngredientsId Servings 
## 1  ABC   xyz {"a","b","c"}  {1,2,3}  7 
## 2  DEF   lmn {"d","e","f"}  {4,5,6}  8 

Отсюда, она занимает мало усилий, чтобы преобразовать вложенные списки в Ingredients нечто большее, чем просто строка:

datlist <- as.list(dat) 
datlist$Ingredients <- mapply(function(a,b) { 
    a1 <- strsplit(substring(a, 2, nchar(a)-1), ",")[[1]] 
    ## might want to remove leading/trailing quotes as well 
    a1 <- gsub('"', '', a1) 
    b1 <- strsplit(substring(b, 2, nchar(b)-1), ",")[[1]] 
    mapply(function(e,f) list(type=e, id=f), a1, b1, SIMPLIFY=FALSE, USE.NAMES=FALSE) 
}, datlist$Ingredients, datlist$IngredientsId, 
    SIMPLIFY=FALSE, USE.NAMES=FALSE) 
datlist$IngredientsId <- NULL # to remove the now-unnecessary field 

library(RJSONIO) # jsonlite::toJSON looks similar, not exactly the same 
cat(toJSON(datlist, pretty=T)) 
## { 
## "RecipeName" : [ 
##  "ABC", 
##  "DEF" 
## ], 
## "MainIngredient" : [ 
##  "xyz", 
##  "lmn" 
## ], 
## "Ingredients" : [ 
##  [ 
##   { 
##    "type" : "a", 
##    "id" : "1" 
##   }, 
##   { 
##    "type" : "b", 
##    "id" : "2" 
##   }, 
##   { 
##    "type" : "c", 
##    "id" : "3" 
##   } 
##  ], 
##  [ 
##   { 
##    "type" : "d", 
##    "id" : "4" 
##   }, 
##   { 
##    "type" : "e", 
##    "id" : "5" 
##   }, 
##   { 
##    "type" : "f", 
##    "id" : "6" 
##   } 
##  ] 
## ], 
## "Servings" : [ 
##  7, 
##  8 
## ] 
## }> 

к сожалению, принимая одну строку из результатов data.frame в вложенных компонентах (В частности Ingredients), так что это не хорошо прилегать к нужному выходу:

datlist2 <- as.list(dat[1,]) 
## rest of mapply(mapply(...)) ... 
cat(toJSON(datlist2, pretty=TRUE)) 
## { 
## "RecipeName" : "ABC", 
## "MainIngredient" : "xyz", 
## "Ingredients" : [ 
##  [ 
##   { 
##    "type" : "a", 
##    "id" : "1" 
##   }, 
##   { 
##    "type" : "b", 
##    "id" : "2" 
##   }, 
##   { 
##    "type" : "c", 
##    "id" : "3" 
##   } 
##  ] 
## ], 
## "Servings" : 7 
## } 
Смежные вопросы