2017-07-16 294 views
0

我的问题有点类似https://stackoverflow.com/questions/3695677/how-to-find-common-elements-from-multiple-vectors的问题。假设我有3个向量长度都相同的:R:如何在多个向量中找到具有相同索引的共同元素

v1 <- c(1, 99, 10, 11, 23) 
v2 <- c(1, 99, 10, 23, 11) 
v3 <- c(2, 4, 10, 13, 23) 

比较V1和V2:

可以很容易地看到,v1v2具有相同的元素,这将通过Reduce(intersect, list(v1, v2))返回。但是,我只想要重叠仅在向量中的顺序相同时才返回。因此,我只希望看到1 99 10,因为它们都分别作为索引1,2,3排序。

比较v1和v3: 这里应该返回10 23

比较v2和v3: 只应返回10。 为了处理两两比较,我想我会使用嵌套循环:

v_all = list(v1, v2, v3) 
length_v = length(v_all) - 1 
for(i in 1:length_v){ 
    v_ind = 1:length(v_all) 
    v_2 = v_ind[-which(v_all == i)] 
    for(j in v_2){ 
    #code for finding overlap 
    } 
} 
+0

你可以用'重叠<找到两个向量的重叠 - 函数(X,Y) {x [x == y]}' – Henry

+0

'length_v'在你的例子中似乎是14。这是故意的吗? – Henry

+0

@亨利谢谢你指出。我将'v_all'改成了一个列表。所以'length_v'应该是2,这是我想要的。 – Adrian

回答

1

我们可以用一个简单的对比检查做到这一点:

x == y 

和子集X通过它:x[x==y]。那么问题是如何最好地在组合上循环它。

在这里,我将使用outer来获取矢量列表的每个组合的所有输出,并在其上调用矢量化匿名函数。

v1 <- c(1, 99, 10, 11, 23) 
v2 <- c(1, 99, 10, 23, 11) 
v3 <- c(2, 4, 10, 13, 23) 

l = list(v1,v2,v3) 


outer(l,l,Vectorize(function(x,y){x[x==y]})) 

    [,1]  [,2]  [,3]  
[1,] Numeric,5 Numeric,3 Numeric,2 
[2,] Numeric,3 Numeric,5 10  
[3,] Numeric,2 10  Numeric,5 
如果在输出矩阵看

,每个小区是索引列表的重叠:

output[1,2] 
[[1]] 
[1] 1 99 10 
+0

谢谢。有没有一种快速的方法来查看哪个'i,j'单元格的列表具有> 1但<5个元素? – Adrian

相关问题