使用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
相关产品推荐
相关产品推荐

