如何在R语言多层嵌套列表中保留第一层列表元素
解决多层嵌套列表仅保留第一层非嵌套元素的问题
错误原因分析
你之前的代码逻辑有误:map_depth(my_list, 1, ~ keep(.x, vec_depth(.x) > 1)) 里,map_depth(1) 会把第一层的每个元素单独传给keep,但keep是用来筛选整个集合的工具,不是处理单个元素的,这就导致了长度不匹配的报错。
正确解决方案
我们不需要用map_depth,直接对整个列表做筛选即可,有两种简洁的方式:
方法1:用purrr::keep保留深度为1的元素
vec_depth(.x) == 1 可以精准识别第一层的非嵌套元素(非列表类型的深度都是1,嵌套列表的深度≥2):
library(purrr) my_list <- list( a.1 = "some text", b.1 = NA, c.1 = integer(0), d.1 = "some text", e.1 = list(a.2 = "some text", b.2 = "a2"), f.1 = list(c.2 = "some text", d.2 = integer(10), e.2 = list(a.3 = "some deep text")) ) my_list2 <- keep(my_list, ~ vec_depth(.x) == 1)
方法2:用purrr::discard移除所有列表元素
如果你的需求就是去掉所有嵌套的列表项,直接判断元素是否为列表类型更直观:
my_list2 <- discard(my_list, is.list)
验证结果
运行上述代码后,my_list2的结构和你期望的完全一致:
my_list2 #> $a.1 #> [1] "some text" #> #> $b.1 #> [1] NA #> #> $c.1 #> integer(0) #> #> $d.1 #> [1] "some text"
内容的提问来源于stack exchange,提问作者DeduciveR
相关产品推荐
相关产品推荐

