2017-07-16 293 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

相關問題