187 votes

Comment trouver les éléments communs de plusieurs vecteurs ?

Quelqu'un peut-il me dire comment trouver les éléments communs de plusieurs vecteurs ?

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

Je veux obtenir les éléments communs des vecteurs ci-dessus (ex : 3 et 9).

54 votes

Ce n'est pas une bonne idée d'utiliser c comme nom de variable...

5 votes

Pourquoi est-ce une lettre comme les autres ?

14 votes

@DimitriPetrenko parce que vous pouvez déclarer des listes avec c(1,2...) .

391voto

bnaul Points 4006

Il y a peut-être une façon plus intelligente de procéder, mais

intersect(intersect(a,b),c)

fera l'affaire.

EDIT : Plus intelligemment, et plus commodément si vous avez beaucoup d'arguments :

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

22 votes

+1 pour nous avoir rappelé Reduce et la majuscule R correcte !

8 votes

Il convient de noter que intersect est pour les opérations d'ensemble. Si vous avez des éléments récurrents dans les vecteurs, vous perdrez cette information car les vecteurs sont transformés en ensembles avant l'intersection. Par exemple intersect(c(1,1,2,3), c(1,1,3,4)) aurait pour conséquence c(1,3) et vous auriez pu vouloir le résultat c(1,1,3) .

2 votes

@GioraSimchoni comment pouvez-vous obtenir c(1,1,3), si c'est vraiment ce que vous voulez ?

25voto

James Points 24725

Une bonne réponse déjà, mais il y a quelques autres façons de faire :

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

ou,

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

Vous pouvez évidemment omettre le unique si vous savez qu'il n'y a pas de valeurs répétées à l'intérieur de a , b o c .

0 votes

Comment puis-je trouver les éléments communs à différentes colonnes d'un même cadre de données ? Les éléments sont numériques. J'ai essayé la fonction reduce qui ne donne rien. J'ai essayé de les convertir en facteurs, sans résultat.

10voto

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 Un code plus simple

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

intersect_all(a,b,c)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X