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

Cha*_*res 143 r vector

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

a <- c(1,3,5,7,9)
b <- c(3,6,8,9,10)
c <- c(2,3,4,5,7,9)
Run Code Online (Sandbox Code Playgroud)

我想从上面的向量中得到共同的元素(例如:3和9)

bna*_*aul 301

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

intersect(intersect(a,b),c)
Run Code Online (Sandbox Code Playgroud)

会做的.

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

Reduce(intersect, list(a,b,c))
Run Code Online (Sandbox Code Playgroud)

  • +1提醒我们关于`Reduce`和正确的R大写! (14认同)
  • 值得注意的是,"intersect"用于设置操作.如果在向量中重复出现元素,则会丢失此信息,因为向量在交叉之前变为集合.例如`intersect(c(1,1,2,3),c(1,1,3,4))`会产生`c(1,3)`,你可能想要结果`c(1 ,1,3)`. (8认同)
  • @GioraSimchoni 你怎么能得到 c(1,1,3),如果这真的是你想要的? (2认同)

Jam*_*mes 19

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

unique(c[c%in%a[a%in%b]])
Run Code Online (Sandbox Code Playgroud)

要么,

tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]
Run Code Online (Sandbox Code Playgroud)

unique如果你知道其中没有重复的值a,你可以显然省略这些调用,b或者c.


Abh*_*ady 5

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

更新编辑更简单的代码

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

intersect_all(a,b,c)
Run Code Online (Sandbox Code Playgroud)