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)
Related videos on Youtube
Author by
Chares
Updated on January 18, 2020Comments
-
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 over 13 yearsIt's not a good idea to use
c
as variable name... -
Mostafa90 almost 8 yearswhy it's a letter like others ?
-
Mathias711 over 7 years@DimitriPetrenko because you can declare lists with
c(1,2...)
.
-
-
mariotomo almost 13 years+1 for reminding us about
Reduce
and the correct R capitalization! -
Giora Simchoni over 7 yearsIt 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 inc(1,3)
, and you might have wanted the resultc(1,1,3)
. -
StatsSorceress over 5 years@GioraSimchoni how could you get c(1,1,3), if that is really what you want?
-
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 thematch
function along with negative subscripting to iteratively remove from each of the vectors every element added to the "kernel". -
kcm over 3 yearshow 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