【问题标题】:How to write a JSON object from R dataframe with grouping如何使用分组从 R 数据框编写 JSON 对象
【发布时间】:2014-11-18 03:38:59
【问题描述】:

总的来说,我觉得有必要通过折叠多个列来制作 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'}]}]}

对于 'query':'2' 也是如此

我希望以 mongo 导入/导出单个 json 行格式吐出它们。 任何指针也很感激..

【问题讨论】:

  • 类似lapply(split(data, data$B), toJSON)?
  • 不,这不起作用,因为我需要按 A、B 列分组,然后使用 C 为每个 B col 值创建值部分

标签: json r jsonlite


【解决方案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"

如果您可以接受包含向量而不是命名列表的“类型”变量,那么以下代码可能就足够了:

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

【讨论】:

  • 您的意思是“值”变量是向量而不是命名列表吗?是的,我可以忍受。感谢您的回答
  • 一个对我有用的解决方案是将 C 列汇总为向量并使 A、B 对独一无二。有没有一种解决方案可以对多个列进行增量处理,直到获得一个主键列?
  • 我不确定你的意思。如果将 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)])。)
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2019-06-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多