Como encontrar elementos comuns de múltiplos vetores?


159

Alguém pode me dizer como encontrar os elementos comuns de vários vetores?

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

Quero obter os elementos comuns dos vetores acima (ex: 3 e 9)


45
Não é uma boa idéia usar ccomo nome de variável ...
Marek

4
por que é uma carta como as outras?
Mostafa 27/05

12
@DimitriPetrenko porque você pode declarar listas com c(1,2...).
Mathias711

Respostas:


333

Pode haver uma maneira mais inteligente de fazer isso, mas

intersect(intersect(a,b),c)

fará o trabalho.

EDIT: Mais inteligente e mais conveniente se você tiver muitos argumentos:

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

16
+1 por nos lembrar Reducee a capitalização correta de R!
Mariotomo 12/08

8
Vale ressaltar que intersecté para operações definidas. Se houver elementos recorrentes nos vetores, você perderá essas informações porque os vetores são transformados em conjuntos antes da interseção. Por exemplo intersect(c(1,1,2,3), c(1,1,3,4)), resultaria em c(1,3), e você poderia ter desejado o resultado c(1,1,3).
Giora Simchoni 13/10

1
@GioraSimchoni como você conseguiu c (1,1,3), se é isso mesmo que você quer?
StatsSorceress

@StatsSorceress Suponha que você queira a "interseção preservando duplicatas" de vetores que consistem em números inteiros positivos, todos em uma lista L. O código a seguir funciona: 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])))Outra maneira de fazer isso usaria a matchfunção junto com a assinatura negativa para remover iterativamente de cada um dos vetores todos os elementos adicionados ao "kernel".
Montgomery Clift

24

Uma boa resposta já, mas existem algumas outras maneiras de fazer isso:

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

ou,

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

Você pode, obviamente, omitir as uniquechamadas se você sabe que existem valores não repetidos dentro a, bou 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)

UPDATE EDIT Um código mais simples

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

intersect_all(a,b,c)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.