Как найти общие элементы из нескольких векторов?

Может ли кто-нибудь сказать мне, как найти общие элементы из нескольких векторов?

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

Я хочу получить общие элементы из приведенных выше векторов (например: 3 и 9)


person Chares    schedule 12.09.2010    source источник
comment
Не рекомендуется использовать c в качестве имени переменной ...   -  person Marek    schedule 13.09.2010
comment
почему это письмо, как и другие?   -  person Mostafa    schedule 27.05.2016
comment
@DimitriPetrenko, потому что вы можете объявлять списки с c(1,2...).   -  person Mathias711    schedule 29.08.2016


Ответы (3)


Возможно, есть более умный способ сделать это, но

intersect(intersect(a,b),c)

сделаю свою работу.

РЕДАКТИРОВАТЬ: умнее и удобнее, если у вас много аргументов:

Reduce(intersect, list(a,b,c))
person bnaul    schedule 12.09.2010
comment
+1 за напоминание о Reduce и правильном использовании заглавных букв R! - person mariotomo; 12.08.2011
comment
Стоит отметить, что intersect предназначен для операций с наборами. Если у вас есть элементы, повторяющиеся в векторах, вы потеряете эту информацию, потому что векторы превращаются в наборы до пересечения. Например. intersect(c(1,1,2,3), c(1,1,3,4)) приведет к c(1,3), и вы могли захотеть получить результат c(1,1,3). - person Giora Simchoni; 13.10.2016
comment
@GioraSimchoni, как вы могли получить c (1,1,3), если это действительно то, что вы хотите? - person StatsSorceress; 25.08.2018
comment
@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 вместе с отрицательным индексом для итеративного удаления из каждого из векторов каждый элемент добавлен в ядро. - person Montgomery Clift; 03.10.2019

Это уже хороший ответ, но есть еще пара способов сделать это:

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

or,

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

Очевидно, вы можете опустить вызовы unique, если знаете, что в a, b или c нет повторяющихся значений.

person James    schedule 13.09.2010
comment
как я могу найти общие элементы в разных столбцах в одном кадре данных, элемент является числовым, я попробовал функцию уменьшения, а не вышел, я попытался преобразовать их в коэффициент, все еще нет ответа, но если я попробую один, например, пересечь (df $ a, df $ b ) и т. д. работает ... так как у меня всего 40 столбцов, это громоздко сделать ... не могли бы вы предложить что-то более короткое - person krushnach Chandra; 12.09.2020

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)
person Abhishek K Baikady    schedule 27.05.2016