2017-11-28 21 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)] 
    }) 

노동 조합을 만드는에게 보여주고 싶은 경우 이름을 사용 다른 벡터의 어떤 요소가 유니온에 없는지를 확인하는 것