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)]
})
对未使用的向量进行联合并检查另一个向量的哪个元素不在联合中
我想提取多个向量之间的所有共享元素和非共享元素。
假设我有这些向量:
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)]
})
对未使用的向量进行联合并检查另一个向量的哪个元素不在联合中