Dans R, j'ai un élément x
et un vecteur v
. Je veux trouver le premier index d'un élément dans v
qui est égal à x
. Je sais qu’une façon de procéder est la suivante: which(x == v)[[1]]
, mais cela semble excessivement inefficace. Y a-t-il un moyen plus direct de le faire?
Pour les points bonus, existe-t-il une fonction qui fonctionne si x
est un vecteur? C'est-à-dire qu'il devrait renvoyer un vecteur d'indices indiquant la position de chaque élément de x
dans v
.
La fonction match
fonctionne sur les vecteurs:
x <- sample(1:10)
x
# [1] 4 5 9 3 8 1 6 10 7 2
match(c(4,8),x)
# [1] 1 5
match
ne renvoie que la première rencontre d'une correspondance, comme vous l'avez demandé. Il retourne la position dans le deuxième argument des valeurs dans le premier argument.
Pour les correspondances multiples, %in%
est le chemin à parcourir:
x <- sample(1:4,10,replace=TRUE)
x
# [1] 3 4 3 3 2 3 1 1 2 2
which(x %in% c(2,4))
# [1] 2 5 9 10
%in%
renvoie un vecteur logique tant que le premier argument, avec un TRUE
si cette valeur peut être trouvée dans le deuxième argument et un FALSE
sinon.
la fonction Position
de funprog {base} fait également l'affaire. Il vous permet de transmettre une fonction arbitraire et renvoie la première ou la dernière correspondance.
Position(f, x, right = FALSE, nomatch = NA_integer)
Une petite note sur l'efficacité des méthodes susmentionnées:
library(microbenchmark)
microbenchmark(
which("Feb" == month.abb)[[1]],
which(month.abb %in% "Feb"))
Unit: nanoseconds
min lq mean median uq max neval
891 979.0 1098.00 1031 1135.5 3693 100
1052 1175.5 1339.74 1235 1390.0 7399 100
Donc, le meilleur est
which("Feb" == month.abb)[[1]]