我的问题与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:
很容易看出v1
和v2
具有相同的元素,这些元素将由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 :(得分: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