如何用purrr::keep过滤含col3的嵌套列表元素?
问题:过滤嵌套列表中包含指定列的数据框
示例代码:
library(dplyr) library(purrr) df1 <- data.frame( col1 = 1:5, col2 = 6:10 ) df2 <- df1 %>% mutate(col3 = 1:5) ls <- list( a = list(df1 = df1), b = list( df1 = df1, df2 = df2 ), c = list( df2 = df2 ) )
需求:过滤嵌套列表ls,仅保留其中包含名为col3列的数据框,期望结果如下:
list( b = list( df2 = df2 ) ,c = list( df2 = df2 ) )
当前尝试的代码接近目标,但未过滤掉顶级列表中过滤后为空的元素:
ls %>% map( ~keep(.x, ~ "col3" %in% names(.x)) )
解决方案
在原有代码基础上,添加一步过滤,移除顶级列表中为空的子列表即可:
ls %>% map(~keep(.x, ~ "col3" %in% names(.x))) %>% keep(~length(.x) > 0)
说明
- 第一步
map遍历顶级列表的每个元素(a、b、c),对每个子列表使用keep筛选出包含col3列的数据框; - 第二步
keep过滤掉顶级列表中长度为0的空列表(比如a过滤后为空,会被移除),最终得到符合要求的结果。
内容的提问来源于stack exchange,提问作者sactyr
相关产品推荐
相关产品推荐

