R xml2查询对应XML节点时为缺失值填充NA生成数据框的方法
解决方案
核心思路
- 不要单独提取所有
<Name>和<Salary>节点,否则会丢失节点间的顺序对应关系 - 按原XML的节点顺序遍历所有子节点,碰到
<Name>就缓存当前人名,碰到<Salary>就和最近缓存的<Name>配对,未配对到<Salary>的<Name>默认赋值NA
完整可运行代码
library(tidyverse) library(xml2) # 示例XML interimxml <- read_xml("<Subdivision> <Name>Charles</Name> <Salary>100</Salary> <Name>Laura</Name> <Name>Steve</Name> <Salary>200</Salary> </Subdivision>") # 按顺序获取根节点下所有子节点 all_child_nodes <- xml_children(interimxml) current_name <- NULL res <- list() for (node in all_child_nodes) { node_type <- xml_name(node) if (node_type == "Name") { # 上一个Name还没配对Salary,先存为NA if (!is.null(current_name)) { res <- append(res, list(tibble(Name = current_name, Salary = NA_character_))) } # 缓存当前新Name current_name <- xml_text(node) } else if (node_type == "Salary") { # 和当前缓存的Name配对 res <- append(res, list(tibble(Name = current_name, Salary = xml_text(node)))) current_name <- NULL } } # 处理最后一个未配对的Name if (!is.null(current_name)) { res <- append(res, list(tibble(Name = current_name, Salary = NA_character_))) } # 合并为最终tibble,可按需转数值类型 final_tbl <- bind_rows(res) %>% mutate(Salary = as.double(Salary)) # 查看结果 final_tbl
运行结果
# A tibble: 3 × 2 Name Salary <chr> <dbl> 1 Charles 100 2 Laura NA 3 Steve 200
内容的提问来源于stack exchange,提问作者minimouse
相关产品推荐
相关产品推荐

