2017-05-31 34 views
4

有條件子集列表,我有以下列表:如何使用purrr包

x <- list(1:5, 1:10) 
x 
#> [[1]] 
#> [1] 1 2 3 4 5 

#> [[2]] 
#> [1] 1 2 3 4 5 6 7 8 9 10 

,並希望只選擇含有10

預期結果的元素:

#> [[1]] 
#> [1] 1 2 3 4 5 6 7 8 9 10 

我怎樣才能做到這一點,並在生產線使用管道運營商和purrr包?

該foll。代碼有效,但感覺有點笨拙。

x %>% map_lgl(~contains(.,10L)) %>% subset(x,.) 

有沒有更好的方法使用x和管道運算符每一次?

回答

7

您可以使用purrr::keep

library(purrr) 

x <- list(1:5, 1:10) 

x 

#> [[1]] 
#> [1] 1 2 3 4 5 
#> 
#> [[2]] 
#> [1] 1 2 3 4 5 6 7 8 9 10 

x %>% keep(~ 10 %in% .x) 

#> [[1]] 
#> [1] 1 2 3 4 5 6 7 8 9 10 
+0

這是嗚嗚聲! :-)我是新手,不知何故錯過了這個功能。非常感謝@austensen – Noel

2
x[sapply(x, function(x) any(x == 10))] 
+0

'X [sapply(X,is.element,EL = 10)]'如果你正在尋找擠幾個大字出來。 – thelatemail

+0

哈哈,感謝匿名downvoter我現在在32,666點 –

+0

謝謝@洪Ooi,但正在尋找一種方式使用管道操作員和嗚嗚聲。 – Noel

1

我們可以使用Filter

Filter(function(x) 10 %in% x, x) 
#[[1]] 
#[1] 1 2 3 4 5 6 7 8 9 10 

或用purrr

x %>% 
    purrr::map_lgl(~10 %in% .) %>% 
    x[.] 

我們可以把這個功能

filterL <- function(lst, val){ 
     lst %>% 
     purrr::map_lgl(~val %in% .) %>% 
     lst[.] 
} 

filterL(x, 10) 
#[[1]] 
# [1] 1 2 3 4 5 6 7 8 9 10 
+2

感謝@akrun,但接受答案中的[purrr :: keep](http://purrr.tidyverse.org/reference/keep.html)函數就是我正在尋找的。 – Noel

相關問題