假设我有 5 个向量:
a <- c(1,2,3) b <- c(2,3,4) c <- c(1,2,5,8) d <- c(2,3,4,6) e <- c(2,7,8,9)
我知道我可以使用以下方法计算它们之间的交集Reduce()和...一起intersect(), 像这样:
Reduce()
intersect()
Reduce(intersect, list(a, b, c, d, e)) [1] 2
但是我怎样才能找到至少 2 个向量中共有的元素呢? IE。:
[1] 1 2 3 4 8
它比很多人看起来的要简单得多。这应该是非常有效的。
将所有内容放入向量中:
x <- unlist(list(a, b, c, d, e))
寻找重复项
unique(x[duplicated(x)]) # [1] 2 3 1 4 8
and sort如果需要的话。
sort
注意:如果列表元素中可能存在重复项(您的示例似乎并未暗示),则替换x with x <- unlist(lapply(list(a, b, c, d, e), unique))
x
x <- unlist(lapply(list(a, b, c, d, e), unique))
编辑:由于 OP 表示对 n >= 2 的更通用的解决方案感兴趣,我会这样做:
which(tabulate(x) >= n)
如果数据仅由自然整数(1、2 等)组成,如示例所示。如果不:
f <- table(x) names(f)[f >= n]
现在这与詹姆斯的解决方案相差不远,但它避免了昂贵的sort。而且它比计算所有可能的组合要快得多。