使用R语言XML库将XML转CSV时rbind.data.frame报错如何解决
报错原因
rbind.data.frame要求所有待合并的列表元素长度完全一致,你运行报错是因为xmlToList()将XML文件转为列表后,列表内各子元素的长度不相等,通常是因为原始XML文件中不同节点包含的字段数量不一样,比如部分节点有额外的属性字段、部分节点缺失某个子节点。
修复方案
方案1:使用
dplyr::bind_rows兼容不等长列表该函数会自动为缺失字段填充NA值,无需手动统一列表长度,兼容性更强:
# 未安装dplyr先执行安装 # install.packages("dplyr") library(XML) library(dplyr) mydata <- xmlParse("2021-11-29-alp_gene_3.xml") mydata1 <- xmlToList(mydata) # 替换原有do.call(rbind.data.frame)代码 mydata3 <- bind_rows(mydata1)方案2:纯基础包实现,先统一列表长度再合并
不想引入第三方依赖可以用这个方法,先给短列表补全空值到最大长度再合并:
library(XML) mydata <- xmlParse("2021-11-29-alp_gene_3.xml") mydata1 <- xmlToList(mydata) # 计算所有列表项的最大长度 max_length <- max(sapply(mydata1, length)) # 遍历补全所有列表项长度 mydata1 <- lapply(mydata1, function(item) { length(item) <- max_length return(item) }) mydata3 <- do.call(rbind.data.frame, mydata1)
导出Excel代码
得到规整的数据框后,执行以下代码导出为Excel文件:
# 未安装writexl先执行安装 # install.packages("writexl") library(writexl) write_xlsx(mydata3, "转换结果.xlsx")
内容的提问来源于stack exchange,提问作者Allan Okwaro
相关产品推荐
相关产品推荐

