You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析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)

代码说明

  1. map(df$col, ...)遍历col列的每一个字符串,单独处理每行的类JSON内容
  2. 每行解析后生成独立的宽格式数据框,即使键值对数量不同也能兼容
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:34:58