我想在多个向量之间提取所有共享元素和非共享元素。
说我有这些载体:
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)
但是这个数字是不正确的,因为按比例进行比较......任何想法都很容易做到这一点?
答案 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)]
})
对未使用的向量进行并集,并检查另一个向量的哪个元素不在并集中