2010-09-12 18 views
94

¿Alguien me puede decir cómo encontrar los elementos comunes de varios vectores?¿Cómo encontrar elementos comunes de varios vectores?

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

quiero conseguir los elementos comunes de los vectores anteriores (Ej: 3 y 9)

+24

No es una buena idea utilizar 'C' como nombre de la variable ... – Marek

+1

por eso que es una carta como los demás? –

+4

@DimitriPetrenko porque puede declarar listas con 'c (1,2 ...)'. – Mathias711

Respuesta

210

Puede haber una manera más inteligente de hacer esto, pero

intersect(intersect(a,b),c) 

hará el trabajo.

EDIT: Más inteligente, y más convenientemente si usted tiene una gran cantidad de argumentos:

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

+1 para recordarnos acerca de 'Reducir' y la correcta capitalización R! – mariotomo

+3

Vale la pena señalar que 'intersectar' es para operaciones de conjunto. Si tiene elementos recurrentes en los vectores, perderá esta información porque los vectores se convierten en conjuntos antes de intersecarse. P.ej. 'intersect (c (1,1,2,3), c (1,1,3,4))' daría como resultado 'c (1,3)', y podría haber deseado el resultado 'c (1, 1,3) '. –

12

Una buena respuesta ya, pero hay un par de otras maneras de hacer esto:

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

o,

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

puede obviamente omitir las llamadas unique si sabe que no hay valores repetidos dentro de a, b o 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) 

ACTUALIZACIÓN EDITAR Un código más simple

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

intersect_all(a,b,c) 
Cuestiones relacionadas