如何解析DataFrame中每行的类JSON结构字段?
解析类JSON格式列到完整DataFrame
你当前代码只输出第一行结果,是因为str_match_all(df$col, "\\{(.*?)\\s(.*?)\\}")[[1]]仅提取了第一行的匹配结果,没有遍历处理所有行。要实现全行解析,需要逐行处理每个类JSON字符串,再合并结果。
示例DataFrame
df <- data.frame( col = c( "[{guid abc123-def456-bf1239435ahfs} {id <nil>} {start_timestamp 1688573993888} {end_timestamp <nil>} {active true}]", "[{guid xyz987-pqr654-lmno0987zxywu} {id <nil>} {start_timestamp 1688574000000} {active false}]", ), stringsAsFactors = FALSE )
修改后的解决方案(tidyverse工具链)
使用purrr::map逐行解析,结合dplyr::bind_rows自动合并不同列数的结果:
library(dplyr) library(purrr) library(tidyr) # 逐行解析每个字符串为宽格式数据框 parsed_rows <- map(df$col, function(str) { # 提取当前行的所有键值对 pairs <- str_match_all(str, "\\{(.*?)\\s(.*?)\\}")[[1]] # 转换为键值对数据框,再转成宽格式 as_tibble(pairs[, -1], .name_repair = ~c("key", "value")) %>% pivot_wider(names_from = key, values_from = value) }) # 合并所有行的结果,缺失列自动填充NA wide_df <- bind_rows(parsed_rows)
代码说明
map(df$col, ...)遍历col列的每一个字符串,单独处理每行的类JSON内容- 每行解析后生成独立的宽格式数据框,即使键值对数量不同也能兼容
bind_rows会自动对齐所有列,缺失的字段用NA填充,完美适配长度不固定的类JSON结构
替代方案(base R)
如果不想依赖tidyverse,可使用base R循环结合plyr::rbind.fill:
library(plyr) wide_df_list <- list() for (i in seq_len(nrow(df))) { pairs <- str_match_all(df$col[i], "\\{(.*?)\\s(.*?)\\}")[[1]] if (nrow(pairs) == 0) next temp_df <- as.data.frame(pairs[, -1], stringsAsFactors = FALSE) names(temp_df) <- c("key", "value") wide_df_list[[i]] <- reshape(temp_df, idvar = NULL, timevar = "key", direction = "wide") } wide_df <- rbind.fill(wide_df_list) names(wide_df) <- gsub("value\\.", "", names(wide_df))
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

