2010-09-12 10 views
94

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

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

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

+24

Это не очень хорошая идея, чтобы использовать 'c' в качестве имени переменной ... – Marek

+1

почему это письмо, как и другие? –

+4

@DimitriPetrenko, потому что вы можете объявлять списки с 'c (1,2 ...)'. – Mathias711

ответ

210

Там может быть поумнее способ пойти об этом, но

intersect(intersect(a,b),c) 

будет делать работа.

EDIT: более умно и более удобно, если у вас есть много аргументов:

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

+1 для напоминания нам о 'Reduce' и правильной R-капитализации! – mariotomo

+3

Стоит отметить, что 'intersect' - для заданных операций. Если у вас есть элементы, повторяющиеся в векторах, вы потеряете эту информацию, потому что векторы превращаются в множества перед пересечением. Например. 'intersect (c (1,1,2,3), c (1,1,3,4))' приведет к 'c (1,3)', и вы, возможно, захотели получить результат 'c (1, 1,3) '. –

12

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

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.

2
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 Более простой код

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

intersect_all(a,b,c) 
Смежные вопросы