假设我有一个列表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
函数的理解,我认为这是一种自然的编码方式。为什么报告错误?任何建议表示赞赏。
答案 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)
为完整起见,这是purrr
,plyr
的替代方案:
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