如何拆分混合字符串并转换为R语言data.frame?
将混合格式字符串转换为R的data.frame
给定一段包含普通键值对和JSON数组的混合字符串,直接用jsonlite::fromJSON()解析会报错,需要拆分两部分分别处理后合并成目标data.frame。示例字符串如下:
string <- "var1: 1, var2: 2, [{\"json_var1\": \"foo\", \"json_var2\": 1}]"
期望得到的目标data.frame:
var1 var2 json_var1 json_var2 1 1 2 foo 1
解决步骤与代码
- 拆分字符串:定位JSON部分的起始位置(以
[为标志),将字符串拆分为普通键值段和JSON段。 - 解析普通键值段:把键值对转换为data.frame,并自动处理数据类型。
- 解析JSON段:用
jsonlite::fromJSON()正常解析JSON数组。 - 合并结果:将两部分的data.frame按行合并。
完整实现代码:
library(jsonlite) # 输入字符串 string <- "var1: 1, var2: 2, [{\"json_var1\": \"foo\", \"json_var2\": 1}]" # 拆分字符串 json_start <- regexpr("\\[", string)[1] non_json_part <- substr(string, 1, json_start - 2) json_part <- substr(string, json_start, nchar(string)) # 处理非JSON键值对 non_json_list <- strsplit(non_json_part, ", ")[[1]] non_json_df <- as.data.frame( matrix( unlist(strsplit(non_json_list, ": ")), ncol = length(non_json_list), byrow = TRUE ), stringsAsFactors = FALSE ) colnames(non_json_df) <- non_json_df[1,] non_json_df <- non_json_df[-1,] # 自动转换数值类型 non_json_df[] <- lapply(non_json_df, function(x) { num_x <- as.numeric(x) if (!all(is.na(num_x))) num_x else x }) # 解析JSON部分 json_df <- fromJSON(json_part) # 合并得到最终data.frame final_df <- cbind(non_json_df, json_df) # 输出结果 print(final_df)
这段代码不依赖固定的键值对数量,只要字符串遵循“普通键值对 + 逗号空格 + JSON数组”的格式,就能适配不同数量的元素。
内容的提问来源于stack exchange,提问作者boshek
相关产品推荐
相关产品推荐

