R:跨多个向量的非共享元素(与交叉相反)

时间:2017-11-28 07:53:32

标签: r intersection overlap difference

我想在多个向量之间提取所有共享元素和非共享元素。

说我有这些载体:

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)

但是这个数字是不正确的,因为按比例进行比较......任何想法都很容易做到这一点?

2 个答案:

答案 0 :(得分:3)

我的方法是先将所有这些矢量组合起来。 然后用表函数计算频率,最后计算长度

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

如果要显示唯一元素,请使用名称

names(temp_table[temp_table == 1])

答案 1 :(得分:1)

这个怎么样

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

对未使用的向量进行并集,并检查另一个向量的哪个元素不在并集中