¿Existe una función R para encontrar el índice de un elemento en un vector?

Resuelto Ryan C. Thompson asked hace 54 años • 4 respuestas

En R, tengo un elemento xy un vector v. Quiero encontrar el primer índice de un elemento que vsea igual a x. Sé que una forma de hacer esto es: which(x == v)[[1]], pero parece excesivamente ineficiente. ¿Existe una forma más directa de hacerlo?

Para obtener puntos de bonificación, ¿existe una función que funcione si xes un vector? Es decir, debería devolver un vector de índices que indique la posición de cada elemento de xin v.

Ryan C. Thompson avatar Jan 01 '70 08:01 Ryan C. Thompson
Aceptado

La función matchfunciona en vectores:

x <- sample(1:10)
x
# [1]  4  5  9  3  8  1  6 10  7  2
match(c(4,8),x)
# [1] 1 5

matchsolo devuelve el primer encuentro de un partido, como lo solicitó. Devuelve la posición en el segundo argumento de los valores del primer argumento.

Para coincidencias múltiples, %in%el camino a seguir es:

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%devuelve un vector lógico tan largo como el primer argumento, con a TRUEsi ese valor se puede encontrar en el segundo argumento y a en FALSEcaso contrario.

Joris Meys avatar Apr 07 '2011 08:04 Joris Meys

la función Positionen funprog {base} también hace el trabajo. Le permite pasar una función arbitraria y devuelve la primera o la última coincidencia.

Position(f, x, right = FALSE, nomatch = NA_integer)

pedroteixeira avatar Feb 11 '2013 14:02 pedroteixeira

Una pequeña nota sobre la eficacia de los métodos mencionados anteriormente:

 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

Entonces, el mejor es

    which("Feb" == month.abb)[[1]]
Andrii avatar May 17 '2018 18:05 Andrii