R:如何在多个向量中找到具有相同索引的公共元素

时间:2017-07-16 23:45:44

标签: r vector

我的问题与https://stackoverflow.com/questions/3695677/how-to-find-common-elements-from-multiple-vectors问题有些相似。假设我有3个相同长度的向量:

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
  }
}

1 个答案:

答案 0 :(得分:1)

我们可以使用简单的比较检查来做到这一点:

x == y

并通过它对x进行子集化:x[x==y]。那么问题是如何最好地将它循环到组合上。

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

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