2017-10-05 62 views
2

假设我有矢量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个向量。

回答

0

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

谢谢你Ronak Shah – Noor

0

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

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

谢谢Michael Bird – Noor