如何使用分组从R数据帧编写JSON对象

时间:2014-11-18 03:38:59

标签: json r jsonlite

总的来说,我觉得需要通过折叠多个列来制作JSON对象。没有直接的方法可以做到这一点。如果有..请指出它。

我有

的数据
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'

我希望以mongo导入/导出单独的json行格式吐出它们。 任何指针也赞赏..

1 个答案:

答案 0 :(得分: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.frames列表的data.frame单元格:

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

如果你能接受你的&#34;输入&#34;包含向量而不是命名列表的变量,那么以下代码可能就足够了:

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"]}]}]