如何在R中提取含NULL且变量不统一的JSON列并拆分字段
解决R中解析JSON列并拆分到单独列的问题
问题根源
你遇到的报错是因为submitted_data列里的JSON格式不标准:
- 日期(如
2002-03-04)、字符串值(如retail)没有加双引号,JSON要求字符串必须用双引号包裹 - R的
NULL不是JSON规范里的null,无法被jsonlite识别
解决步骤
1. 构造原始数据集
先还原你的初始数据:
library(tibble) df <- tibble( Name = c("Bob", "Fadela", "Andy"), Company = c("Bob Inc.", "Fadela Co.", "Andrew Inc."), submitted_data = c('{"dob":2002-03-04, "tel": 1234}', "NULL", '{"dob": 1999-10-10, "industry": retail}') )
2. 修正JSON格式
用正则表达式把不标准的JSON转为规范格式:
# 将R的NULL替换为JSON的"null" df$submitted_data <- gsub("NULL", '"null"', df$submitted_data) # 给日期格式的内容添加双引号 df$submitted_data <- gsub("([0-9]{4}-[0-9]{2}-[0-9]{2})", '"\\1"', df$submitted_data) # 给未加引号的字符串值添加双引号 df$submitted_data <- gsub("(:\\s*)([a-zA-Z]+)([,}])", "\\1\"\\2\"\\3", df$submitted_data)
3. 解析JSON并合并数据
用jsonlite解析修正后的JSON列,再和原数据合并:
library(jsonlite) library(dplyr) # 逐个解析JSON字符串,转为数据框行 json_rows <- lapply(df$submitted_data, function(x) { if (x == '"null"') { # 处理空值情况,生成全NA的行 tibble(dob = NA, tel = NA, industry = NA) } else { fromJSON(x) %>% as_tibble() } }) %>% bind_rows() # 合并原数据的Name、Company列和解析后的JSON列 result_df <- cbind(df[, c("Name", "Company")], json_rows) # 可选:将NA替换为显示用的"NULL"(匹配示例输出格式) result_df <- result_df %>% mutate(across(everything(), ~ifelse(is.na(.), "NULL", .)))
最终结果
运行后得到的result_df格式如下:
| Name | Company | dob | tel | industry |
|---|---|---|---|---|
| Bob | Bob Inc. | 2002-03-04 | 1234 | NULL |
| Fadela | Fadela Co. | NULL | NULL | NULL |
| Andy | Andrew Inc. | 1999-10-10 | NULL | retail |
内容的提问来源于stack exchange,提问作者William Wormell
相关产品推荐
相关产品推荐

