seleccionar - ¿Existe una función R para encontrar el índice de un elemento en un vector?
operaciones con vectores en r (4)
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 forma 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, ¿existe una función que funcione si x
es un vector? Es decir, debe devolver un vector de índices que indiquen la posición de cada elemento de x
en v
.
La función Position
en 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)
La función de 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 un match, según lo solicites. Devuelve la posición en el segundo argumento de los valores en el primer argumento.
Para coincidencias múltiples, %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 siempre que el primer argumento, con un valor TRUE
si ese valor se puede encontrar en el segundo argumento y un FALSE
caso contrario.
R ha sobrecargado el operador doble es igual a ==
con un método para encontrar el índice de una aguja en un pajar de vectores. Produce un vector logical
, que contiene valores TRUE
para cada partida 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 se pueden expandir para usar también múltiples vectores.
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]]