2017-11-28 10 views
2

複数のベクトル間で共有要素と非共有要素をすべて抽出したい。R:複数のベクトルにまたがる共有されていない要素(交差点と反対側)

は、私はこれらのベクトルを持っていると言う:

set.seed(9) 
a <- sample(LETTERS,10,replace=F) 
b <- sample(LETTERS,10,replace=F) 
c <- sample(LETTERS,10,replace=F) 

私は最初のベン図とその重複を探る:

venn.diagram(list('a'=a,'b'=b,'c'=c), filename="test.png", height=1000, width=1000, imagetype="png", units="px") 

test

私はすべてが共有する要素を取得する方法を知っていますベクター(中央3)は、次のようになります。

shared <- Reduce(intersect, list(a,b,c)) 
length(shared)#3, correct 

しかし、グループ間で共有されていない要素を取得するにはどうすればいいですか(5 + 7 + 5 = 17)?

outersect <- function(a,b) unique(c(setdiff(a,b), setdiff(b,a))) 
unshared <- Reduce(outersect, list(a,b,c)) 
length(unshared)#20, I expect 17 (5+7+5) 

しかし、比較はペアごとのベースで作られているので数は、間違っています...簡単にこれを行うにはすべてのアイデア:

私の試みは以下の通りですか?

答えて

3

私のアプローチは、すべてのそれらのベクトルを最初に組み合わせることです。 は、表関数の頻度をカウントし、最後に長さ

temp = c(a,b,c) 
temp_table = table(temp) 
length(temp_table[temp_table == 1]) 

を計算して、ユニークな要素

names(temp_table[temp_table == 1]) 
+0

もちろんテーブルを使って!ありがとう、これは本当に直感的です – DaniCee

1

方法については、この

lapply(1:3,function(i){ 
    sets[[i]][!sets[[i]] %in% Reduce(union,sets[i != c(1,2,3)],init = NULL)] 
    }) 

組合を作るに表示したい場合は名前を使用します使用されていないベクトルのうちのどのベクトルが他のベクトルのどの要素が組合に属していないかをチェックする。

関連する問題