Vérifier si deux vecteurs contiennent les mêmes (non ordonnée) des éléments dans les R
J'aimerais vérifier si deux vecteurs contiennent les mêmes éléments, même s'ils ne sont pas commandé le même. Par exemple, la fonction (appelons SameElements
) doit satisfaire à ces critères:
SameElements(c(1, 2, 3), c(1, 2, 3)) # TRUE
SameElements(c(1, 2, 3), c(3, 2, 1)) # TRUE
SameElements(c(1, 2, 1), c(1, 2)) # FALSE
SameElements(c(1, 1, 2, 3), c(3, 2, 1)) # FALSE
Edit 1: Spécifié que la fonction doit retourner F lorsque les vecteurs contiennent les mêmes éléments, mais avec des fréquences différentes.
Edit 2: Nettoyé question d'omettre première réponse, comme c'est maintenant dans ma réponse réelle.
- Que diriez -
all(a %in% b)
. Il répond pour l'essentiel à la question Sont tous les éléments dea
contenues dans le vecteurb
? Si les valeurs sont uniques, alors vous pourriez aussi utiliser quelque chose commeanyNA(match(a,b))
- Ah bon appel, désolé n'était pas clair. Je suis à la recherche de F dans ce scénario (question édité pour plus de clarté).
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pouvez utiliser
setequal(a,b)
Mise à jour mise à jour
setequal
vérifie si deux vecteurs sont composés des mêmes éléments, mais il ne permet pas de vérifier si ces éléments ont les mêmes événements dans chacun de ces vecteurs.%in%
🙂match
)setequal
est plus commeall( sapply(a, "%in%", table=b) ) & all(sapply(b, "%in%", table=a) )
> setequal
retourneall(c(match(x, y, 0L) > 0L, match(y, x, 0L) > 0L))
. En outre,%in%
est également fondée sur le match:> %in%
retournematch(x, table, nomatch = 0L) > 0L
.setequal(c(1, 2, 1), c(1, 2, 2)) # [1] TRUE
En lieu et place d'une alternative plus propre, voici la solution:
Edit:
identical
au lieu deall.equal(...) == T
par nrussell de la suggestion.F <- function(a,b) identical(sort(a),sort(b))
vous permettront d'économiser 3 frappes (le==T
) à partir de votreSameElements
la fonction ci - dessus soigné question si +1.Vous pouvez être intéressé par la "comparer" paquet. Cette réponse démontre la
compare()
fonction, mais pour votre cas, vous pourriez faire tout aussi bien aveccompareIgnoreOrder()
(ce qui correspond presque exactement à votre question du titre).Il y a plusieurs arguments qui peuvent être ajoutés comme les transformations qui doivent être autorisés en tentant de comparer les éléments. Dans les exemples ci-dessous (pour économiser un peu de temps), j'ai demandé à la fonction de permettre à toutes les transformations (
allowAll = TRUE
) à l'exception de la modification de la longueur du vecteur (shorten = FALSE
).Des données de l'échantillon:
Voici ma solution:
Comme vous pouvez le voir, il travaille pour un nombre quelconque de vecteurs en entrée aussi longtemps que vous les mettez tous dans une liste.
Un liner:
Fondamentalement, votre problème peut être décrit dans les étapes suivantes :
Dans le bon R code :
Quelques exemples :
ameElements(v1, v2) # FALSE comme les fréquences de test est violé
PS : i) Vous pouvez remplacer
!all()
parany()
~~~ii) D'accélérer le code que vous pouvez rapidement revenir
FALSE
lorsque les deux vecteurs ne sont pas~~~ont la même longueur, évitant ainsi les fréquences de calcul.