You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dplyr创建嵌套数据框生成JSON时遇输出不符预期问题

问题分析

你的代码之所以得到每个ID仅对应1行嵌套数据的结果,核心原因是:同一个ID对应的values值完全重复(A的values都是1,B的都是2),第一次group_by(ID, values) %>% nest()后,每个ID已经只剩1行数据,再按ID嵌套自然就得到了过浅的层级,这显然不是适合生成JSON的结构。

解决方案:调整嵌套逻辑,生成适合JSON的层级

假设你想要的是类似 {"ID": "A", "data": [{"level_1": "C", "values": 1, "other_values": [1,2]}]} 这种带数组的JSON结构,我们可以通过两种方式调整:

方式1:直接将重复列整理为数组(最适合JSON)

先把同一分组下的other_values合并成列表,再按ID嵌套,这样生成的结构转JSON时会自动变成数组:

library(tidyr)
library(dplyr)

# 原始数据
df <- data.frame(
  "ID" = c("A", "A", "B", "B"), 
  "level_1" = c("C", "C", "D", "D"), 
  "values" = c(1,1,2,2), 
  "other_values" = c(1,2,3,4)
)

# 生成适合JSON的嵌套结构
df_nested <- df %>%
  # 按ID、level_1、values分组,将other_values合并为列表
  group_by(ID, level_1, values) %>%
  summarise(other_values = list(other_values), .groups = "drop") %>%
  # 按ID嵌套,把level_1、values、other_values打包成子数据
  nest(data = c(level_1, values, other_values))

# 查看结果
df_nested

输出结果:

# A tibble: 2 × 2
  ID    data             
  <chr> <list>           
1 A     <tibble [1 × 3]>
2 B     <tibble [1 × 3]>

方式2:保留多层嵌套(如果后续需要更细的操作)

如果需要保留values层级的独立性(比如后续values可能有不同值),可以先按ID+level_1+values嵌套,再按ID嵌套:

df_nested2 <- df %>%
  group_by(ID, level_1, values) %>%
  nest() %>%  # 先嵌套other_values的原始行
  group_by(ID) %>%
  nest()      # 再按ID嵌套整个层级

df_nested2

转成JSON验证

用jsonlite包把嵌套数据转成JSON,就能得到预期的结构化输出:

library(jsonlite)
toJSON(df_nested, pretty = TRUE)

输出的JSON:

[
  {
    "ID": "A",
    "data": [
      {
        "level_1": "C",
        "values": 1,
        "other_values": [1, 2]
      }
    ]
  },
  {
    "ID": "B",
    "data": [
      {
        "level_1": "D",
        "values": 2,
        "other_values": [3, 4]
      }
    ]
  }
]

内容的提问来源于stack exchange,提问作者audioslaver756

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:32:00