You need to enable JavaScript to run this app. R语言将data.frame内XML列多节点拆分生成宽表的方法咨询
优惠活动
大模型
产品
解决方案
定价
更多

R语言将data.frame内XML列多节点拆分生成宽表的方法咨询

实现方案

整体思路:逐行解析XML列内容,提取每行内所有CD节点的目标字段,再将嵌套结果展开为符合要求的长表。

依赖包准备

用到xml2做XML解析,dplyr/tidyr/purrr做数据框操作,未安装先运行:

install.packages(c("xml2", "dplyr", "tidyr", "purrr"))

加载包:

library(xml2)
library(dplyr)
library(tidyr)
library(purrr)

分步处理代码

  1. 先清理XML列的无效残留标签(示例中第二个XML单元格末尾多了闭合标签</CATALOG>,会导致解析报错),再补充统一根标签:
Sample_df <- Sample_df %>%
  # 清理无效残留标签,你可以根据实际脏数据调整正则规则
  mutate(XML_col = gsub("</CATALOG>", "", XML_col)) %>%
  # 补充统一根标签
  mutate(XML_col = paste0("<Data>", XML_col, "</Data>"))
  1. 逐行解析XML,提取CD节点的字段后展开为长表:
final_df <- Sample_df %>%
  # 逐行处理XML文本,生成嵌套列表列,每个元素是该行所有CD的字段小表
  mutate(cd_list = map(XML_col, ~ {
    # 解析当前行的XML文本
    xml_doc <- read_xml(.x)
    # 提取当前行下所有CD节点
    cd_nodes <- xml_find_all(xml_doc, "//CD")
    # 提取每个CD节点的TITLE、ARTIST文本,整理为小数据框
    tibble(
      TITLE = xml_text(xml_find_first(cd_nodes, "TITLE")),
      ARTIST = xml_text(xml_find_first(cd_nodes, "ARTIST"))
    )
  })) %>%
  # 展开嵌套列,每个CD自动生成一行,保留原有列
  unnest(cd_list) %>%
  # 可选:删除原XML列,不需要保留可以运行这行
  select(-XML_col)

结果说明

运行完成后final_df即为4行4列的目标结构,包含原有label_col、number_col,以及新增的TITLE、ARTIST字段。
该逻辑支持单元格内CD数量动态变化,无需提前指定CD个数,适配不同行数的同类场景。

内容的提问来源于stack exchange,提问作者SteveG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 12:15:03