如何在R中将指定列嵌套为fields结构并生成目标JSON
R语言实现DataFrame嵌套字段并生成指定格式JSON
问题描述
需要基于以下Schema生成JSON文件:
col1, col2, fields{name, value}
现有包含col1至col4的DataFrame,要求将col3和col4嵌套到fields数组中,每个列对应一个对象:对象的name为列名,value为对应行的值。
尝试了以下代码但未实现预期嵌套效果:
df <- data.frame( col1 = c(seq(1, 5)), col2 = c(seq(6, 10)), col3 = c("a", "b", "c", "d", "e"), col4 = c(seq(100, 104)) ) |> nest(fields = c(col3, col4)) # format to json cat(rjson::toJSON(unname(split(df, 1:nrow(df)))))
期望生成的JSON格式示例:
{ "col1":1, "col2":6, "fields":[ { "name":"col3", "value":"a" }, { "name":"col4", "value":100 } ] }
解决方案
直接使用nest()会把col3和col4嵌套成子DataFrame,而非name-value结构的数组。你需要将每行的目标列转换为指定结构的嵌套列表,以下是两种实现方式:
方式一:固定列名实现
适合列名固定的场景,代码直观易懂:
library(dplyr) library(purrr) library(rjson) df <- data.frame( col1 = seq(1, 5), col2 = seq(6, 10), col3 = c("a", "b", "c", "d", "e"), col4 = seq(100, 104) ) # 转换每行的col3和col4为fields数组 result_df <- df |> rowwise() |> mutate(fields = list( list(list(name = "col3", value = col3), list(name = "col4", value = col4)) )) |> ungroup() |> select(col1, col2, fields) # 生成JSON并输出 cat(rjson::toJSON(unname(split(result_df, 1:nrow(result_df)))))
方式二:动态列实现
适合需要处理任意多列的场景,无需硬编码列名:
library(dplyr) library(purrr) library(rjson) df <- data.frame( col1 = seq(1, 5), col2 = seq(6, 10), col3 = c("a", "b", "c", "d", "e"), col4 = seq(100, 104) ) # 定义需要嵌套的列(这里取第3到第4列) target_cols <- names(df)[3:4] result_df <- df |> rowwise() |> mutate(fields = list( # 遍历目标列,生成name-value结构的对象 map(target_cols, ~ list(name = ., value = get(.))) )) |> ungroup() |> select(col1, col2, fields) # 生成JSON并输出 cat(rjson::toJSON(unname(split(result_df, 1:nrow(result_df)))))
代码关键说明
rowwise():让后续mutate操作按行独立执行,确保每行生成对应的fields数组。list(...)/map(...):将目标列的列名和值包装成指定的name-value结构,再组合成数组。ungroup():取消行分组,恢复DataFrame的常规操作模式。select():仅保留需要的列,避免多余数据混入最终JSON。
内容的提问来源于stack exchange,提问作者Ryan Garnett
相关产品推荐
相关产品推荐

