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

R: unshared elements across multiple vectors (opposite to intersect)

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

假设我有这些向量:

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")

我知道如何获取所有向量共享的元素(中心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)

但是这个数字是不正确的,因为比较是在成对的基础上进行的...有没有办法轻松做到这一点?

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

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

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

names(temp_table[temp_table == 1])

这个怎么样

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

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