如何从多个向量中找到共同的元素?


159

谁能告诉我如何从多个向量中找到共同的元素?

a <- c(1,3,5,7,9)
b <- c(3,6,8,9,10)
c <- c(2,3,4,5,7,9)

我想从上面的向量中获取公共元素(例如:3和9)


45
c用作变量名不是一个好主意……
Marek 2010年

4
为什么像其他人一样来信?
Mostafa

12
@DimitriPetrenko,因为您可以使用声明列表c(1,2...)
Mathias711 '16

Answers:


333

可能有一个更聪明的方法来解决这个问题,但是

intersect(intersect(a,b),c)

会做的工作。

编辑:更聪明,更方便,如果您有很多参数:

Reduce(intersect, list(a,b,c))

16
+1提醒我们有关Reduce以及正确的R大写字母!
mariotomo

8
值得注意的是,这intersect是针对集合操作的。如果向量中有重复的元素,则会丢失此信息,因为向量在相交之前变成了集合。例如,intersect(c(1,1,2,3), c(1,1,3,4))将导致结果c(1,3),您可能想要结果c(1,1,3)
Giora Simchoni '16

1
@GioraSimchoni,如果您真的想要c(1,1,3),那您怎么能得到它呢?
StatsSorceress

@StatsSorceress假设您要由正整数组成的向量的“交集保留重复项”,都在列表L中。以下代码起作用:N <- max(unlist(L)); LT <- lapply(L, tabulate, nbins = N); v <- do.call(pmin, LT); unlist(sapply(1:N, function(x) rep(x, v[x])))另一种方法是使用该match函数以及负下标来迭代地从每个向量中删除每个添加到“内核”的元素。
蒙哥马利克利夫特

24

已经是一个很好的答案,但是还有其他几种方法可以做到这一点:

unique(c[c%in%a[a%in%b]])

要么,

tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]

unique如果您知道或中没有重复的值a,显然可以忽略呼叫。bc


7
intersect_all <- function(a,b,...){
  all_data <- c(a,b,...)
  require(plyr)
  count_data<- length(list(a,b,...))
  freq_dist <- count(all_data)
  intersect_data <- freq_dist[which(freq_dist$freq==count_data),"x"]
  intersect_data
}


intersect_all(a,b,c)

更新编辑更简单的代码

intersect_all <- function(a,b,...){
  Reduce(intersect, list(a,b,...))
}

intersect_all(a,b,c)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.