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

时间:2019-05-01 16:38:31

标签: 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))

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

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

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

Error: length(.p) == length(.x) is not TRUE

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

3 个答案:

答案 0 :(得分:5)

您的想法正确,但需要利用x$a in c("A","C")创建谓词函数,该谓词函数将访问列表中所需的值。与其说在c(“ A”,“ C”)中说“ a”,不如说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 稍有不同,但这确实有效。

<entity name = "account">

...
...

<link-entity name="opportunity" from ="accountid" to ="accountid" link-type="outer">

reprex package(v0.2.1)于2019-05-01创建

答案 1 :(得分:2)

这是base R

中的一个选项
Filter(function(y) y$a %in% c('A', 'C'), x)
#[[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

答案 2 :(得分:0)

为完整起见,这是purrrplyr的替代方案:

compact(plyr::llply(x,function(x) x[x$a %in% c("A","C")]))


[[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