在`purrr`软件包中使用`keep`函数的正确方法是什么?

Chu*_*uan 3 r purrr

假设我有一个x如下列表:

library(purrr)

set.seed(4152)
x <- rerun(5, a = sample(c("A","B","C","D"),1), b = c(1,2,3,4,5))

Run Code Online (Sandbox Code Playgroud)
x

[[1]]
[[1]]$a
[1] "B"

[[1]]$b
[1] 1 2 3 4 5


[[2]]
[[2]]$a
[1] "B"

[[2]]$b
[1] 1 2 3 4 5


[[3]]
[[3]]$a
[1] "C"

[[3]]$b
[1] 1 2 3 4 5


[[4]]
[[4]]$a
[1] "C"

[[4]]$b
[1] 1 2 3 4 5


[[5]]
[[5]]$a
[1] "A"

[[5]]$b
[1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

我想要keep列表x中的所有元素$a %in% c("A","C"),所以我尝试了:

x_sub <- x %>%
         keep(., "a" %in% c("A","C"))

Error: length(.p) == length(.x) is not TRUE
Run Code Online (Sandbox Code Playgroud)

我认为基于我对keep功能的理解,这是一种自然的编码方式。为什么报告错误?任何建议表示赞赏。

dyl*_*njm 5

您有正确的主意,但需要利用它as_mapper()来创建谓词函数,该谓词函数将访问列表中所需的值。与其说在c(“ A”,“ C”)中说“ a”,不如说是x$a in c("A","C")小的区别,但这使它起作用。

library(tidyverse)

set.seed(4152)
x <- rerun(5, a = sample(c("A","B","C","D"),1), b = c(1,2,3,4,5))

x_sub <- x %>%
  keep(., as_mapper(~.x$a %in% c("A","C")))

x_sub
#> [[1]]
#> [[1]]$a
#> [1] "C"
#> 
#> [[1]]$b
#> [1] 1 2 3 4 5
#> 
#> 
#> [[2]]
#> [[2]]$a
#> [1] "C"
#> 
#> [[2]]$b
#> [1] 1 2 3 4 5
#> 
#> 
#> [[3]]
#> [[3]]$a
#> [1] "A"
#> 
#> [[3]]$b
#> [1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

reprex软件包(v0.2.1)创建于2019-05-01

  • 注意,不需要显式的“ as_mapper”或将“。”用作第一个参数。x%&gt;%keep(〜.x $ a%in%c(“ A”,“ C”)))也可以正常工作。 (2认同)