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

How to find common elements from multiple vectors?

提问人:Chares 提问时间:9/13/2010 最后编辑:zx8754Chares 更新时间:1/17/2020 访问量:276458

问:

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

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

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

矢量 R-FAQ

评论

68赞 Marek 9/13/2010
用作变量名称不是一个好主意......c
6赞 Mostafa90 5/27/2016
为什么是像其他人一样的信?
16赞 Mathias711 8/29/2016
@DimitriPetrenko,因为您可以使用 声明列表。c(1,2...)

答:

440赞 bnaul 9/13/2010 #1

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

intersect(intersect(a,b),c)

会完成这项工作。

编辑:如果你有很多论点,更聪明,更方便:

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

评论

25赞 mariotomo 8/12/2011
+1 提醒我们正确的 R 大写!Reduce
9赞 Giora Simchoni 10/13/2016
值得注意的是,这是针对集合操作的。如果元素在向量中重复出现,则会丢失此信息,因为向量在相交之前会变成集合。例如 将导致 ,您可能想要结果。intersectintersect(c(1,1,2,3), c(1,1,3,4))c(1,3)c(1,1,3)
2赞 StatsSorceress 8/26/2018
@GioraSimchoni 如果这真的是你想要的,你怎么能得到 c(1,1,3) 呢?
0赞 Montgomery Clift 10/3/2019
@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
28赞 James 9/13/2010 #2

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

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

套利

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

如果您知道 或 中没有重复的值,则显然可以省略这些调用。uniqueabc

评论

0赞 kcm 9/12/2020
我怎样才能在单个数据帧的不同列中找到共同的元素,该元素是数字,我尝试了reduce函数,而不是out,我尝试将它们转换为因子仍然没有答案,但是如果我尝试一个,例如intersect(df$a,df$b)等工作..由于我总共有 40 列,所以做起来很麻烦......你能建议一些更短的东西吗
10赞 Abhi 5/27/2016 #3
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)