R:嵌套 data.table 到 JSON
Posted
技术标签:
【中文标题】R:嵌套 data.table 到 JSON【英文标题】:R: Nested data.table to JSON 【发布时间】:2021-12-29 03:59:23 【问题描述】:我想从这样的data.table中获取
temp <- data.table(data = list(data.table(a = 1:2,b=1:2)), type = "A")
data | type |
---|---|
<data.table[2x2]> | A |
像这样的 JSON
"group":
"data": [
"a": 1,
"b": 1
,
"a": 2,
"b": 2
],
"type": "A"
问题是我总是以一个额外的数组“[”结束组。 我试过的是 tidyr::nest 和
temp2 <- temp[, list(group=list(.SD))]
jsonlite::toJSON(temp2,pretty = TRUE, auto_unbox = TRUE)
temp3 <- temp[, (list(group=list(as.list(.SD))))]
jsonlite::toJSON(temp3,pretty = TRUE, auto_unbox = TRUE)
我的问题是否有“简单”的解决方案? 谢谢
编辑更复杂的例子
temp <-
data.table(
id1 = 1:6,
id2 = c(rep("A", 2), rep("B", 2), rep("C", 2)),
data = rep(list(data.table(
a = 1:2, b = 1:2
)), 6),
type = "test"
)
nest1 <- temp[, list(list(.SD)),by=.(id1,id2)] %>% setnames("V1","group")
nest1[, type:="B"]
nest2 <- nest1[, list(list(.SD)),by=.(id2)] %>% setnames("V1","data")
nest2[, type:="C"]
nest3 <- nest2[, list(list(.SD)),by=.(id2)] %>% setnames("V1","group")
jsonlite::toJSON(nest3, pretty = TRUE)
期望的输出(缩短): 组应该只包含对象,不包含数组
[
"id2": "A",
"group":
"data": [
"id1": 1,
"group":
"data": [
"a": 1,
"b": 1
,
"a": 2,
"b": 2
],
"type": "test"
,
"type": "B"
,
"id1": 2,
"group":
"data": [
"a": 1,
"b": 1
,
"a": 2,
"b": 2
],
"type": "test"
,
"type": "B"
],
"type": "C"
,
"id2": "B",
"group":
"data": [],
"type": "C"
]
【问题讨论】:
jsonlite::toJSON(list("group" = temp), pretty = TRUE, auto_unbox = TRUE)
好主意谢谢,但结果还是和上面一样。我最终得到了额外的数组。此外,该示例只是完整嵌套结构的一小部分。
知道了。出于某种原因,我们需要手动拆箱 data.frame。在这方面,IMO 的文档有点模棱两可:auto_unbox
只提到了原子向量,而unbox()
也将 1 行的数据帧拆箱,因此它并没有自动应用 unbox()
。无论如何:jsonlite::toJSON(list(group = jsonlite::unbox(temp)), pretty = TRUE, auto_unbox = TRUE)
应该这样做
非常感谢。您的解决方案适用于我的示例。不幸的是,我无法将它用于我的真正问题。 1)data.table由几行temp <- data.table(data = list(data.table(a = 1:2,b=1:2),data.table(a=2:3,b=3:4)), type = c("A","B"))
组成,并进一步嵌套。我有几个不同级别的组对象。我是否必须从每个对象制作单个 JSON 文件并将它们组合起来?
我在第一篇文章中编辑了一个更复杂的示例
【参考方案1】:
我们可以使用jq
将拆箱作为后处理步骤,因为jsonlite
似乎不允许这种特定用例:
jsonlite::toJSON(nest3, pretty = TRUE) %>%
jqr::jq('walk(if type=="array" and length==1 then .[0] else . end)')
jq
位取自 jq ~ is there a better way to collapse single object arrays?
【讨论】:
非常感谢。不知道这个包。对于我的具体例子来说,它就像一个魅力。最后一个问题。如何使其特定于“组”元素。在这种情况下,如果“数据”只有一个对象,它也会被简化为一个对象,但它需要作为一个数组保留在那里。类似jqr::jq('walk(if .group and type=="array" and length==1 then .[0] else . end)')
好点。我想出了.... %>% jqr::jq('walk(if type=="object" and has("group") and (.group | type)=="array" and (.group | length)==1 then .group = .group[0] else . end)')
,但我不是 jq pro。以上是关于R:嵌套 data.table 到 JSON的主要内容,如果未能解决你的问题,请参考以下文章