r - 在 `keep` 包中使用 `purrr` 函数的正确方法是什么

标签 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 的理解,我认为这是一种自然的编码方式。功能。为什么会报错?任何建议表示赞赏。

最佳答案

您有正确的想法,但需要利用 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

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

关于r - 在 `keep` 包中使用 `purrr` 函数的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55939526/

相关文章:

r - 根据另一列的级别对数​​据框中的列进行排序

r - 我将如何编写 purrr::keep 的递归版本?

r - 从 R 中的行创建 ID 列

r - 一种在 R 中搜索两个列表之间唯一值的非面向索引的方法

r - 创建包含开始位置和结束位置之间的值的列表

删除整个数据框中的句点/点

r - 如何迭代添加列以使用半修改名称重新编码

r - 访问 R 中的嵌套列表

r - 使用 purrr::map 将多个数据帧写入 csv 文件

r - 将变量转换为 %H :%M time format in R