Як знайти спільні елементи з декількох векторів?


159

Хтось може сказати мені, як знайти загальні елементи з декількох векторів?

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

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


45
Недоцільно використовувати cяк ім'я змінної ...
Марек

4
чому це лист, як інші?
Мостафа

12
@DimitriPetrenko, оскільки ви можете оголошувати списки за допомогою c(1,2...).
Mathias711

Відповіді:


333

Можливо, є розумніший спосіб зробити це, але

intersect(intersect(a,b),c)

зробить роботу.

EDIT: Більш розумно і зручніше, якщо у вас є багато аргументів:

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

16
+1 за нагадування про Reduceта правильну R з великої літери!
mariotomo

8
Варто зазначити, що intersectце для встановлених операцій. Якщо у векторах повторюються елементи, ви втратите цю інформацію, оскільки вектори перетворюються на множини до перетину. Наприклад, intersect(c(1,1,2,3), c(1,1,3,4))це призведе до c(1,3), і ви, можливо, хотіли б результату c(1,1,3).
Джора Сімчоні

1
@GioraSimchoni, як ти міг отримати c (1,1,3), якщо це дійсно те, що ти хочеш?
StatsSorceress

@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функцію разом з негативною підпискою на ітераційне видалення з кожного з векторів кожен елемент, доданий до "ядра".
Монтгомері Кліфт

24

Хороша відповідь уже, але є кілька інших способів зробити це:

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

або,

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

Ви, очевидно, можете пропустити uniqueдзвінки, якщо знаєте, що в ньому немає повторних значень a,b або c.


7
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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.