使用purrr::map()向含id的JSON文件列表追加新列
使用purrr::map()给JSON文件列表追加新列的实现方案
当然可以轻松实现这个需求!我会结合具体代码示例,一步步带你完成整个流程——从读取JSON文件,到追加新列,再到(可选)写回更新后的文件。
第一步:准备工作与读取JSON文件列表
首先,你需要先获取目标JSON文件的路径列表,然后用jsonlite把它们读取成数据框的列表。这里假设你的JSON文件都存在同一个目录下,且每个文件里的表格都包含id这个标识符列:
# 加载需要的包 library(purrr) library(jsonlite) library(dplyr) # 用于数据框操作,比如mutate/left_join # 获取所有JSON文件的完整路径 json_file_paths <- list.files( path = "你的JSON文件目录路径", pattern = "\\.json$", # 只匹配JSON文件 full.names = TRUE ) # 读取所有JSON文件为数据框列表 df_list <- map(json_file_paths, ~ read_json(.x, simplifyVector = TRUE))
第二步:追加新列的两种常见场景
接下来分两种最常见的情况来实现追加新列的操作:
场景1:新列数据与每个数据框的id关联
如果你有一份和id对应的新列数据(比如一个包含id和新列值的表格),可以用left_join结合map来匹配追加:
# 示例:假设这是你的新列数据,id要和JSON里的id完全匹配 new_column_data <- tibble( id = c(101, 102, 103), # 对应JSON表格里的id值 new_feature = c("类型A", "类型B", "类型C") # 要追加的新列内容 ) # 遍历每个数据框,根据id合并新列 updated_df_list <- map(df_list, ~ left_join(.x, new_column_data, by = "id"))
这样处理后,每个数据框都会保留原有所有列,同时追加匹配到的new_feature列;如果某个id在新数据里没有对应值,新列会显示NA,你可以根据需求用replace_na调整。
场景2:新列数据来自文件属性(比如文件名)
如果新列的值是基于文件本身的属性(比如文件名、创建时间),可以用map2同时遍历数据框和文件路径,生成新列:
# 给每个数据框追加"source_file"列,值为对应的文件名 updated_df_list <- map2(df_list, json_file_paths, ~ mutate(.x, source_file = basename(.y)))
第三步:(可选)将更新后的数据写回JSON文件
如果需要把修改后的表格保存回JSON文件,可以用walk2(因为我们只需要执行写操作,不需要返回结果):
# 写回原文件(如果不想覆盖,可以修改第二个参数为新的文件路径) walk2(updated_df_list, json_file_paths, ~ write_json(.x, .y, auto_unbox = TRUE))
auto_unbox = TRUE参数可以避免把单个值转成JSON数组,让输出的JSON格式更符合常规表格结构。
小提示
- 读取JSON时,
simplifyVector = TRUE是关键,它能把JSON里的数组结构转换成R的数据框,不然会得到嵌套列表。 - 如果你的JSON结构比较复杂,可以先用
str(df_list[[1]])查看第一个数据框的结构,确保id列存在且格式正确。
内容的提问来源于stack exchange,提问作者Monduiz
相关产品推荐
相关产品推荐

