如何使用 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
我有以下列表:
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