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


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

Para los puntos de bonificación, ¿hay una función que funcione si x es un vector? Es decir, debe devolver un vector de índices que indica la posición de cada elemento de x en v.

Author: Joris Meys, 2011-04-07

4 answers

La función match funciona 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

match solo devuelve el primer encuentro de una partida, según lo solicitado. Devuelve la posición en el segundo argumento de los valores en el primer argumento.

Para la coincidencia múltiple, %in% es el camino a seguir:

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 un TRUE si ese valor se puede encontrar en el segundo argumento y un FALSE de lo contrario.

 319
Author: Joris Meys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-11 10:16:29

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

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

 19
Author: pedroteixeira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-11 14:30:27

Una pequeña nota sobre la eficiencia de los métodos antes mencionados:

 library(microbenchmark)

  microbenchmark(
    which("Feb" == month.abb)[[1]],
    which("Feb" %in% month.abb))

  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]]
 6
Author: andrii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-17 18:23:27

R ha sobrecargado el operador double equals == con un método para encontrar el índice de una aguja en un pajar vectorial. Produce un vector logical, que contiene valores TRUE para cada coincidencia en el pajar.

Ejemplo:

haystack <- c(1, 2, 4, 3, 4)
needle <- 4
indices <- needle == haystack
indices
[1] 3  5
haystack[indices]
[1] 4  4

Funciona si ambos son vectores, y puede expandirse para usar múltiples vectores también.

 2
Author: hiten2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-04 16:19:41