web-dev-qa-db-fra.com

Existe-t-il une fonction R permettant de trouver l'indice d'un élément dans un vecteur?

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.

280
Ryan Thompson

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.

398
Joris Meys

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)

23
pedroteixeira

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]]
7
andrii