How to find common elements from multiple vectors?

236,218

Solution 1

There might be a cleverer way to go about this, but

intersect(intersect(a,b),c)

will do the job.

EDIT: More cleverly, and more conveniently if you have a lot of arguments:

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

Solution 2

A good answer already, but there are a couple of other ways to do this:

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

or,

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

You can obviously omit the unique calls if you know that there are no repeated values within a, b or c.

Solution 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)

UPDATE EDIT A simpler code

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

intersect_all(a,b,c)
Share:
236,218

Related videos on Youtube

Chares
Author by

Chares

Updated on January 18, 2020

Comments

  • Chares
    Chares over 4 years

    Can anyone tell me how to find the common elements from multiple vectors?

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

    I want to get the common elements from the above vectors (ex: 3 and 9)

    • Marek
      Marek over 13 years
      It's not a good idea to use c as variable name...
    • Mostafa90
      Mostafa90 almost 8 years
      why it's a letter like others ?
    • Mathias711
      Mathias711 over 7 years
      @DimitriPetrenko because you can declare lists with c(1,2...).
  • mariotomo
    mariotomo almost 13 years
    +1 for reminding us about Reduce and the correct R capitalization!
  • Giora Simchoni
    Giora Simchoni over 7 years
    It is worth noting that intersect is for set operations. If you have elements recurring in the vectors, you will lose this info because the vectors are turned into sets prior to intersect. E.g. intersect(c(1,1,2,3), c(1,1,3,4)) would result in c(1,3), and you might have wanted the result c(1,1,3).
  • StatsSorceress
    StatsSorceress over 5 years
    @GioraSimchoni how could you get c(1,1,3), if that is really what you want?
  • Montgomery Clift
    Montgomery Clift over 4 years
    @StatsSorceress Suppose you want the "intersection preserving duplicates" of vectors consisting of positive integers, all in a list L. The following code works: 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]))) Another way to do this would use the match function along with negative subscripting to iteratively remove from each of the vectors every element added to the "kernel".
  • kcm
    kcm over 3 years
    how can i find common elements across different column in a single dataframe the element are numeric i tried the reduce function not outout i tried converting them into factor still no answer but if i try one by such as intersect(df$a,df$b) etc working ..since i have a total of 40 columns it cumbersome to do it ...can you suggest something shorter