Как правильно использовать функцию keep в пакете purrr? - PullRequest
3 голосов
/ 01 мая 2019

Предположим, у меня есть список 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 ]

5 голосов
/ 01 мая 2019

У вас правильная идея, но вам нужно использовать as_mapper(), чтобы создать функцию предиката, которая получит доступ к нужному значению в списке.Вместо того, чтобы говорить «a» в c («A», «C»), мы скажем 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 представьте пакет (v0.2.1)

2 голосов
/ 01 мая 2019

Вот один вариант в 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
0 голосов
/ 01 мая 2019

Для полноты, вот альтернатива 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...