【问题标题】:Extract vectors from a list based on given elements根据给定元素从列表中提取向量
【发布时间】:2017-10-05 09:48:38
【问题描述】:

假设我的向量 v 包含 6 个元素和一个包含多个向量的列表,每个向量都有两个元素,该列表是从矩阵 m 生成的,如下所示:

v<-c(1,2,3,4,5,6)

m = matrix( c(1, 2, 10 , 2, 1, 3, 8 ,9,4,6,3,1,9,11,4,7,12,3,2,5),  ncol=2, byrow = TRUE) 

l <-tapply(m,rep(1:nrow(m),ncol(m)),function(i)i)
>  l
$`1`
[1] 1 2

$`2`
[1] 10  2

$`3`
[1] 1 3

$`4`
[1] 8 9

$`5`
[1] 4 6

$`6`
[1] 3 1

$`7`
[1]  9 11

$`8`
[1] 4 7

$`9`
[1] 12  3

$`10`
[1] 2 5

l 列表中,我只想保留在v 中具有两个元素的向量

结果将类似于:

>  R
 $`1`
 [1] 1 2

 $`2`
 [1] 1 3

 $`3`
 [1] 4 6

 $`4`
 [1] 3 1

 $`5`
 [1] 2 5 

原始列表有 18835 个向量。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用sapply 来检查x 中的所有元素是否都存在于v 中,假设每个列表元素中只有2 个元素。

    l[sapply(l, function(x) all(x %in% v))]
    
    
    #$`1`
    #[1] 1 2
    
    #$`3`
    #[1] 1 3
    
    #$`5`
    #[1] 4 6
    
    #$`6`
    #[1] 3 1
    
    #$`10`
    #[1] 2 5
    

    【讨论】:

      【解决方案2】:

      这里我们使用sapplysimplify=T 来创建一个布尔向量,我们可以使用它来对l 进行子集化。我所做的假设是每个列表都有两个元素,但这可以通过将sum 更改为all 并稍作修改来轻松更改。

      l[sapply(l,function(x){sum(x %in% v)==2},simplify = T)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多