如何使用 purrr 包有条件地对列表进行子集化

How to conditionally subset a list using the purrr package

我有以下列表:

x <- list(1:5, 1:10)
x
#> [[1]]
#> [1] 1 2 3 4 5

#> [[2]]
#> [1]  1  2  3  4  5  6  7  8  9 10

并且想 select 仅包含 10 的元素。

想要的结果:

#> [[1]]
#> [1]  1  2  3  4  5  6  7  8  9 10

如何使用管道运算符和 purrr 包在 单行 中简洁地完成此操作?

后续。代码有效,但感觉有点笨拙。

x %>% map_lgl(~contains(.,10L)) %>% subset(x,.)

是否有更好的方法使用 x 和管道运算符各一次?

x[sapply(x, function(x) any(x == 10))]

我们可以使用Filter

Filter(function(x) 10 %in% x, x)
#[[1]]
#[1]  1  2  3  4  5  6  7  8  9 10

purrr

x %>%
    purrr::map_lgl(~10 %in% .)  %>%
    x[.]

我们可以把它变成一个函数

filterL <- function(lst, val){
      lst %>%
         purrr::map_lgl(~val %in% .) %>%
        lst[.]
 }

filterL(x, 10)
#[[1]]
# [1]  1  2  3  4  5  6  7  8  9 10

您可以使用purrr::keep

library(purrr)

x <- list(1:5, 1:10)

x

#> [[1]]
#> [1] 1 2 3 4 5
#> 
#> [[2]]
#>  [1]  1  2  3  4  5  6  7  8  9 10

x %>% keep(~ 10 %in% .x)

#> [[1]]
#>  [1]  1  2  3  4  5  6  7  8  9 10