R语言将数据框嵌套JSON列转为同数据框新增列
嘿,完全懂你这种被混乱JSON列折腾的痛苦!手动写临时处理代码确实繁琐又容易出错,针对你这种每个JSON条目都是单个对象包裹在数组里的情况,咱们用R里的dplyr+purrr+jsonlite组合就能一步搞定,代码简洁还通用。
先把你的示例数据补全方便演示:
library(dplyr) library(jsonlite) library(tidyr) sample.df <- data.frame( id = c(101, 102, 103, 104), json_col = c( '[{"foo_a":"bar"}]', '[{"foo_a":"bar","foo_b":"bar"}]', '[{"foo_a":"bar","foo_c":2}]', '[{"foo_a":"bar","foo_b":"bar","foo_c":3}]' ), stringsAsFactors = FALSE )
接下来是核心处理代码,两步就能完成转换:
- 把JSON列解析成包含数据框的列表列
- 将列表列展开成原数据框的新增列
final_df <- sample.df %>% # 逐个解析JSON字符串,转成单一行的数据框 mutate(json_parsed = purrr::map(json_col, ~ jsonlite::fromJSON(.) %>% as.data.frame(stringsAsFactors = FALSE))) %>% # 把列表里的每个数据框列展开成原数据框的新列,缺失的键自动填NA tidyr::unnest_wider(json_parsed) %>% # 可选:删掉原来的JSON列和临时列表列 select(-json_col, -json_parsed)
运行后你会得到这样的结果:
id foo_a foo_b foo_c 1 101 bar <NA> NA 2 102 bar bar NA 3 103 bar <NA> 2 4 104 bar bar 3
为什么这个方法好用?
- 自动处理缺失的键:比如id=101没有foo_b、foo_c,会自动填充
NA,不用手动判断 - 通用适配:不管JSON里有多少个键,都会自动转换成对应的列,不用提前写死列名
- 代码简洁:管道式写法逻辑清晰,比临时写循环或者逐个提取字段高效太多
如果你的实际数据里偶尔会出现空数组或者多元素数组的情况,这个方法也能兼容:空数组会生成全NA的列,多元素数组会把每个元素拆成单独的行(如果不需要拆分,可以加keep_empty = TRUE参数调整)。
内容的提问来源于stack exchange,提问作者pd441
相关产品推荐
相关产品推荐

