【问题标题】:remove certain vectors from a list从列表中删除某些向量
【发布时间】:2017-03-24 18:20:00
【问题描述】:

我想从列表中删除某些向量。例如,我有这个:

a<-c(1,2,5)
b<-c(1,1,1)
c<-c(1,2,3,4)
d<-c(1,2,3,4,5)
exampleList<-list(a,b,c,d)

exampleList returns of course:
[[1]]
[1] 1 2 5

[[2]]
[1] 1 1 1

[[3]]
[1] 1 2 3 4

[[4]]
[1] 1 2 3 4 5

有没有办法从 R 中的列表中删除某些向量。我想删除列表 exampleList 中同时包含 1 和 5 的所有向量(因此不仅包含 1 或 5 的向量,而且两者都包含)。提前致谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    使用Filter:

    filteredList <- Filter(function(v) !(1 %in% v & 5 %in% v), exampleList)
    print(filteredList)
    #> [[1]]
    #> [1] 1 1 1
    #> 
    #> [[2]]
    #> [1] 1 2 3 4
    

    Filter 使用函数式风格。您传递的第一个参数是一个函数,它返回 TRUE 代表您想要保留在列表中的元素,FALSE 代表您想要删除的元素名单。第二个参数只是列表本身。

    【讨论】:

    • 另一种选择是Filter(function(x) length(setdiff(c(1,5), x)) &gt; 0, exampleList)
    【解决方案2】:

    我们可以在每个列表元素上使用sapply,并删除同时存在值 1 和 5 的元素。

    exampleList[!sapply(exampleList, function(x) any(x == 1) & any(x == 5))]
    
    #[[1]]
    #[1] 1 1 1
    
    #[[2]]
    #[1] 1 2 3 4
    

    【讨论】:

    • exampleList[!sapply(exampleList, function(x) all(c(1,5) %in% x) )]
    • @jogo yess 一直以来我都在尝试使用 x %in% c(1, 5) 之类的东西,这肯定给了我不正确的结果。
    • ... 我正在寻找我的答案的一步变体:D
    【解决方案3】:

    这里有两个步骤的解决方案:

    exampleList<-list(a=c(1,2,5), b=c(1,1,1), c=c(1,2,3,4), d=c(1,2,3,4,5))
    L <- lapply(exampleList, function(x) if (!all(c(1,5) %in% x)) x)
    L[!sapply(L, is.null)]
    # $b
    # [1] 1 1 1
    # 
    # $c
    # [1] 1 2 3 4
    

    这是一个没有任何新函数定义的单步变体

    exampleList[!apply(sapply(exampleList, '%in%', x=c(1,5)), 2, all)]
    

    (...但它有两个应用函数调用)

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 2019-08-05
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2019-12-29
      • 2015-07-12
      • 1970-01-01
      相关资源
      最近更新 更多