如何将缺失的XML标签值读取为0或NA?保证序列位置对应
解决XML缺失标签的位置对应填充问题
你的问题根源在于直接提取_omsmaximodia标签时,只会返回存在该标签的结果,丢失了缺失项的位置信息。要保证结果顺序和原_atraso节点完全对应,正确的思路是先遍历所有父节点_atraso,再逐个检查每个父节点下是否存在目标子标签,这样就能在对应位置填充缺失值。
具体实现步骤:
首先,先获取所有的_atraso父节点,这是保证顺序和长度的关键:
library(xml2) # 读取XML文件并提取所有_atraso节点 atraso_nodes <- read_xml(filename) %>% xml_find_all("//_atraso")
接下来,我们可以用两种方式逐个处理每个_atraso节点:
方法1:使用purrr(代码更简洁)
library(purrr) omsmaximodia <- map(atraso_nodes, function(node) { # 在当前_atraso节点下查找_omsmaximodia子节点 target_node <- xml_find_first(node, "./_omsmaximodia") if (!is.na(target_node)) { # 存在标签时,提取属性并格式化数值 xml_attr(target_node, "_omsmaximodia") %>% gsub("\\.", "", .) %>% # 去掉原有的点分隔符 gsub(",", ".", .) %>% # 把逗号替换为标准小数点 as.numeric() } else { # 不存在标签时,返回NA(需要0的话直接换成0即可) NA_real_ } }) %>% unlist() # 把列表转为向量
方法2:使用基础R(无需额外安装purrr)
omsmaximodia <- lapply(atraso_nodes, function(node) { target_node <- xml_find_first(node, "./_omsmaximodia") if (!is.na(target_node)) { xml_attr(target_node, "_omsmaximodia") %>% gsub("\\.", "", .) %>% gsub(",", ".", .) %>% as.numeric() } else { 0 # 这里填充0,可根据需求改为NA } }) %>% unlist()
为什么这个方法有效?
我们是严格按照原_atraso节点的顺序逐个处理,每个父节点都会在结果中对应一个位置:
- 如果该父节点有
_omsmaximodia标签,就提取并处理它的属性值; - 如果没有,就填充你需要的NA或0。
这样最终得到的omsmaximodia向量长度和atraso_nodes的长度完全一致(也就是32),缺失标签的位置也会准确对应,不会出现顺序混乱的问题。
内容的提问来源于stack exchange,提问作者afarah
相关产品推荐
相关产品推荐

