【问题标题】:How to conditionally subset a list using the purrr package如何使用 purrr 包有条件地对列表进行子集化
【发布时间】:2017-10-31 16:45:00
【问题描述】:

我有以下列表:

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 包在 single 行中简洁地做到这一点?

下一个。代码有效,但感觉有点笨拙。

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

有没有更好的方法使用x 和管道运算符每个只用一次?

【问题讨论】:

    标签: r list subset purrr


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 这是咕噜声……完美! :-) 我是 purrr 的新手,不知何故错过了这个功能。非常感谢@austensen
    【解决方案2】:
    x[sapply(x, function(x) any(x == 10))]
    

    【讨论】:

    • x[sapply(x, is.element, el=10)] 如果你想从中挤出几个字符。
    • 感谢@HongOoi,但正在寻找一种使用管道运算符和咕噜声的方法。
    【解决方案3】:

    我们可以使用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
    

    【讨论】:

    • 感谢@akrun,但接受的答案中的purrr::keep 函数正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 2014-02-20
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多