+1 pour nous rappeler Reduceet la bonne capitalisation R!
mariotomo
8
Il est à noter que intersectc'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))cela aboutirait c(1,3), et vous auriez peut-être voulu le résultat c(1,1,3).
Giora Simchoni
1
@GioraSimchoni comment pourriez-vous obtenir c (1,1,3), si c'est vraiment ce que vous voulez?
StatsSorceress
@StatsSorceress Supposons que vous vouliez "l'intersection préservant les doublons" de vecteurs constitués d'entiers positifs, tous dans une liste L. Le code suivant fonctionne: 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])))Une autre façon de faire cela consisterait à utiliser la matchfonction avec un indice négatif pour supprimer itérativement de chacun des vecteurs chaque élément ajouté au "noyau".
Montgomery Clift
24
Une bonne réponse déjà, mais il existe plusieurs autres façons de le faire:
c
comme nom de variable ...c(1,2...)
.Réponses:
Il y a peut-être une manière plus intelligente de procéder, mais
fera le travail.
EDIT: Plus intelligemment et plus facilement si vous avez beaucoup d'arguments:
la source
Reduce
et la bonne capitalisation R!intersect
c'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))
cela aboutiraitc(1,3)
, et vous auriez peut-être voulu le résultatc(1,1,3)
.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])))
Une autre façon de faire cela consisterait à utiliser lamatch
fonction avec un indice négatif pour supprimer itérativement de chacun des vecteurs chaque élément ajouté au "noyau".Une bonne réponse déjà, mais il existe plusieurs autres façons de le faire:
ou,
Vous pouvez évidemment omettre les
unique
appels si vous savez qu'il n'y a pas de valeurs répétées dansa
,b
ouc
.la source
UPDATE EDIT Un code plus simple
la source