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)
分步处理代码
- 先清理XML列的无效残留标签(示例中第二个XML单元格末尾多了闭合标签
</CATALOG>,会导致解析报错),再补充统一根标签:
Sample_df <- Sample_df %>% # 清理无效残留标签,你可以根据实际脏数据调整正则规则 mutate(XML_col = gsub("</CATALOG>", "", XML_col)) %>% # 补充统一根标签 mutate(XML_col = paste0("<Data>", XML_col, "</Data>"))
- 逐行解析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
相关产品推荐
相关产品推荐

