gpt4 book ai didi

json - 避免数据框到嵌套 JSON 的嵌套循环

转载 作者:行者123 更新时间:2023-12-02 01:02:51 24 4
gpt4 key购买 nike

给定一个表示某种层次结构的 data_frame,我想将此数据转换为具有特定结构的嵌套 JSON。

给定这个data_frame

df <- data_frame(
"parent" = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C"),
"child1" = c("a", "a", "b", "b", "c", "d", "d", "e", "e", "f", "f", "f", "f", "g", "g"),
"child2" = c("aa", "ab", "ba", "bb", "ca", "da", "db", "ea", "eb", "fa", "fb", "fc", "fd", "ga", "gb"),
"value" = sample(seq(1,100,1), 15)
)

我想生成以下 JSON 结构:

[
{
"name": "A",
"children": [
{
"name": "a",
"children": [
{"name": "aa", "value": 89},
{"name": "ab", "value": 20}
]
},
{
"name": "b",
"children": [
{"name": "ba", "value": 25},
{"name": "bb", "value": 15}
]
},
{
"name": "c",
"children": [
{"name": "ca","value": 95}
]
}
]
},
{
"name": "B",
"children": [
{
"name": "d",
"children": [
{"name": "da", "value": 54},
{"name": "db", "value": 62}
]
},
{
"name": "e",
"children": [
{"name": "ea", "value": 100},
{"name": "eb", "value": 56}
]
}
]
},
{
"name": "C",
"children": [
{
"name": "f",
"children": [
{"name": "fa", "value": 69},
{"name": "fb", "value": 98},
{"name": "fc", "value": 83},
{"name": "fd", "value": 63}
]
},
{
"name": "g",
"children": [
{"name": "ga", "value": 91},
{"name": "gb", "value": 77}
]
}
]
}
]

目前我使用嵌套循环构造嵌套列表如下:

lll <- list()
i <- 1

for (a in unique(df$parent)) {

lll[[i]] <- list(
"name" = a,
"children" = list()
)

ii <- 1

for (b in unique(df$child1[df$parent == a])) {
lll[[i]]$children[[ii]] <- list(
"name" = b,
"children" = list()
)

iii <- 1

for(c in unique(df$child2[df$parent == a & df$child1 == b])) {

lll[[i]]$children[[ii]]$children[[iii]] <- list(
"name" = c,
"value" = df$value[df$parent == a & df$child1 == b & df$child2 == c ]
)

iii <- iii + 1

}

ii <- ii + 1
}

i <- i + 1

}

使用 jsonlite::toJSON(lll, pretty = TRUE, auto_unbox = TRUE) 可以将此列表转换为嵌套的 JSON。

不知道有没有更优雅的方式。我尝试使用 purrr 解决这个问题,但没有成功。

最佳答案

您可以通过结合使用 dplyr::group_by()tidyr::nest() 来实现:

library(dplyr)
library(tidyr)

df %>%
rename(name = child2) %>%
group_by(parent, child1) %>%
nest(.key = "children") %>%
rename(name = child1) %>%
group_by(parent) %>%
nest(.key = "children") %>%
rename(name = parent) %>%
jsonlite::toJSON(pretty = TRUE, auto_unbox = TRUE)
#> [
#> {
#> "name": "A",
#> "children": [
#> {
#> "name": "a",
#> "children": [
#> {
#> "name": "aa",
#> "value": 64
#> },
#> {
#> "name": "ab",
#> "value": 29
#> }
#> ]
#> },
#> {
#> "name": "b",
#> "children": [
#> {
#> "name": "ba",
#> "value": 73
#> },
#> {
#> "name": "bb",
#> "value": 45
#> }
#> ]
#> },
#> {
#> "name": "c",
#> "children": [
#> {
#> "name": "ca",
#> "value": 95
#> }
#> ]
#> }
#> ]
#> },
#> {
#> "name": "B",
#> "children": [
#> {
#> "name": "d",
#> "children": [
#> {
#> "name": "da",
#> "value": 26
#> },
#> ...

为了重现您的列名,代码通过调用 dplyr::rename 变得更加笨拙。没有它们,操作的结构将变得更加明显:

df %>% 
group_by(parent, child1) %>%
nest() %>%
group_by(parent) %>%
nest() %>%
jsonlite::toJSON(pretty = TRUE, auto_unbox = TRUE)

关于json - 避免数据框到嵌套 JSON 的嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49358577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com