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)
它比许多人看起来要简单得多.这应该非常有效.
将所有内容放入向量中:
x <- unlist(list(a, b, c, d, e))
Run Code Online (Sandbox Code Playgroud)寻找重复
unique(x[duplicated(x)])
# [1] 2 3 1 4 8
Run Code Online (Sandbox Code Playgroud)并且sort如果需要的话.
注意:如果列表元素中可能存在重复项(您的示例似乎并未涉及),则替换x为x <- 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.它比计算所有可能的组合快几英里.