使用purrr::map处理XML时如何为生成的tibble添加列表索引列
解决方案
完全可以通过tidyverse实现,无需额外写base R循环。你之前的代码出错是因为直接将两层嵌套列表交给bind_rows处理,它会把所有内层元素识别为同级列表项依次编号,.id自然变成行序号。只需调整逻辑:先给每个外层列表的所有行统一加上对应外层索引,再合并所有数据即可。
代码实现
library(tidyverse) library(xml2) trials %>% # 原有提取逻辑不变 map(~xml_find_all(., "AdditionalData/Parameters/Parameter")) %>% map(~xml_attrs(.)) %>% # imap遍历同时获取外层索引,.x为每个测试的参数列表,.y为外层索引值 imap_dfr(~ bind_rows(.x) %>% mutate(test = as.character(.y)))
逻辑说明
imap是purrr提供的带索引遍历函数,.y自动对应遍历对象的外层下标(1、2、3……即你需要的测试编号)- 先给同一测试的所有参数行统一添加相同的
test值,再合并所有测试的数据,最终输出的结果就符合你要求的格式。
如果不习惯用imap,也可以用map2配合索引序列实现,逻辑完全一致:
param_list <- trials %>% map(~xml_find_all(., "AdditionalData/Parameters/Parameter")) %>% map(~xml_attrs(.)) map2_dfr(param_list, seq_along(param_list), ~ bind_rows(.x) %>% mutate(test = as.character(.y)))
内容的提问来源于stack exchange,提问作者Ben Fox
相关产品推荐
相关产品推荐

