Dans R, j'ai un élément x
et un vecteur v
. Je veux trouver le premier index d'un élément v
qui est égal à x
. Je sais qu'une façon de procéder est:, which(x == v)[[1]]
mais cela semble excessivement inefficace. Existe-t-il un moyen plus direct de le faire?
Pour les points bonus, existe-t-il une fonction qui fonctionne si x
c'est un vecteur? Autrement dit, il devrait retourner un vecteur d'indices indiquant la position de chaque élément de x
in v
.
r
indexing
match
vectorization
Ryan C. Thompson
la source
la source
which(x == v)[[1]]
n'est pas très inefficace. C'est un==
opérateur de comparaison ( ) appliqué à tous les éléments vectoriels et un sous-ensemble sur les indices (which
). C'est tout. Rien de pertinent, tant que vous n'exécutez pas 10 000 répétitions sur cette fonction. D'autres solutions telles quematch
etPosition
peuvent ne pas renvoyer autant de données quewhich
, mais elles ne sont pas nécessairement plus efficaces.which(x == v)[[1]]
non.Réponses:
La fonction
match
fonctionne sur des vecteurs:match
renvoie uniquement la première rencontre d'un match, comme vous l'avez demandé. Il renvoie la position dans le deuxième argument des valeurs dans le premier argument.Pour la correspondance multiple,
%in%
c'est la voie à suivre:%in%
renvoie un vecteur logique tant que le premier argument, avec unTRUE
si cette valeur peut être trouvée dans le deuxième argument et unFALSE
sinon.la source
match
matière si vous voulez l'index de la première occurrence. Pour votre exemple,match(x,c(4,8))
donne des résultats différents, ce qui n'est pas super évident au premier abord.match
. Tout est expliqué ici. Mais j'ai ajouté cette information.la fonction
Position
dans funprog {base} fait également le travail. Il vous permet de passer une fonction arbitraire et renvoie la première ou la dernière correspondance.Position(f, x, right = FALSE, nomatch = NA_integer)
la source
Une petite note sur l'efficacité des méthodes susmentionnées:
Donc, le meilleur est
la source
which("Feb" == month.abb)
retourne également -2
pourquoi le[[1]]
?which(x == v)[[1]]
, mais qui semble trop inefficace. »R a surchargé l'
==
opérateur double égal avec une méthode de recherche de l'indice d'une aiguille dans une botte de foin vectorielle. Il donne unlogical
vecteur contenant desTRUE
valeurs pour chaque correspondance dans la botte de foin.Exemple:
Cela fonctionne si les deux sont des vecteurs et peut être étendu pour utiliser plusieurs vecteurs également.
la source
==
opérateur a déjà été mentionné dans ma question comme une solution inefficace qui ne fonctionne pas avec un vecteur d'aiguilles.FALSE FALSE TRUE FALSE TRUE
place des indices dans cet exemple==
renvoie un vecteur logique, pas des indices. Pour cela, vous avez besoinwhich()
, comme je l'ai expliqué il y a 7 ans.