如何找到至少2个向量中常见的元素?

enr*_*ero 2 r vector set-operations

说我有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)
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过Reduce()一起使用来计算所有这些之间的交集intersect(),如下所示:

Reduce(intersect, list(a, b, c, d, e))
[1] 2
Run Code Online (Sandbox Code Playgroud)

但是,如何才能找到至少2个向量中常见的元素?即:

[1] 1 2 3 4 8
Run Code Online (Sandbox Code Playgroud)

flo*_*del 5

它比许多人看起来要简单得多.这应该非常有效.

  1. 将所有内容放入向量中:

    x <- unlist(list(a, b, c, d, e))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 寻找重复

    unique(x[duplicated(x)])
    # [1] 2 3 1 4 8
    
    Run Code Online (Sandbox Code Playgroud)

并且sort如果需要的话.

注意:如果列表元素中可能存在重复项(您的示例似乎并未涉及),则替换xx <- unlist(lapply(list(a, b, c, d, e), unique))


编辑:由于OP表示对更通用的解决方案感兴趣,其中n> = 2,我会这样做:

which(tabulate(x) >= n)
Run Code Online (Sandbox Code Playgroud)

如果数据仅由自然整数(1,2等)组成,如示例中所示.如果不:

f <- table(x)
names(f)[f >= n]
Run Code Online (Sandbox Code Playgroud)

现在这与詹姆斯解决方案相差不远,但它避免了代价高昂的问题sort.它比计算所有可能的组合快几英里.