2014-11-18 3 views
0

В целом я чувствую, что необходимо создавать объекты JSON, складывая несколько столбцов. Прямого способа сделать этот афайк нет. Пожалуйста, направляйте его, если есть ..Как написать объект JSON из R-кадра данных с группировкой

У меня есть данные этого от

A B C 
1 a x 
1 a y 
1 c z 
2 d p 
2 f q 
2 f r 

Как написать JSON, который выглядит как

{'query':'1', 'type':[{'name':'a', 'values':[{'value':'x'}, {'value':'y'}]}, {'name':'c', 'values':[{'value':'z'}]}]} 

и аналогично для «запроса»:» 2 '

Я ищу, чтобы наплевать на них в формате индивидуального json-линии для импорта/экспорта монго. Любые указатели также оценены.

+0

Что-то вроде 'lapply (split, data $ B), toJSON)'? –

+0

Нет, это не работает, поскольку мне нужно группировать по столбцам A, B, а затем создавать часть значения для каждого из значений B col, используя C – ajkl

ответ

1

У вас есть небольшая «нестандартная» вещь с двумя ключами «значение» (я не знаю, является ли это законным json), как вы можете видеть здесь :

(js <- jsonlite::fromJSON('{"query":"1", "type":[{"name":"a", "values":[{"value":"x"}, {"value":"y"}]}, {"name":"c", "values":[{"value":"z"}]}]}')) 
## $query 
## [1] "1" 
## 
## $type 
## name values 
## 1 a x, y 
## 2 c  z 

... с data.frame ячейкой, содержащей список data.frames:

js$type$values[[1]] 
## value 
## 1  x 
## 2  y 
class(js$type$values[[1]]) 
## [1] "data.frame" 

Если вы можете принять переменную «тип», содержащий вектор вместо именованного списка , то, возможно, будет достаточно следующего кода:

jsonlite::toJSON(lapply(unique(dat[, 'A']), function(a1) { 
    list(query = a1, 
     type = lapply(unique(dat[dat$A == a1, 'B']), function(b2) { 
      list(name = b2, 
        values = dat[(dat$A == a1) & (dat$B == b2), 'C']) 
     })) 
})) 
## [{"query":[1],"type":[{"name":["a"],"values":["x","y"]},{"name":["c"],"values":["z"]}]},{"query":[2],"type":[{"name":["d"],"values":["p"]},{"name":["f"],"values":["q","r"]}]}] 
+0

, означает ли вы, что переменная 'values' является вектором вместо именованного списка? И да, я могу жить с этим. Спасибо за ответ – ajkl

+0

Одно из решений, которое для меня работало, - это свертывание столбца C в вектор и создание уникальных пар A, B. Есть ли решение, которое делает это поэтапно для нескольких столбцов, пока вы не получите один столбец первичного ключа? – ajkl

+0

Я не уверен, что вы имеете в виду. Если вы комбинируете A и B с чем-то вроде 'data.frame (AB = paste0 (dat $ A, dat $ B), C = dat $ C)', это немного упростит код (только один 'lapply'), но не будут разбиты на запрос и тип. (Если вам нужно объединить все, кроме последнего столбца, вы можете сделать что-то вроде: 'data.frame (KEY = apply (dat [, - ncol (dat)], 1, paste0, collapse = ''), VAL = dat [, Ncol (DAT)]) '.) – r2evans

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