vectores seleccionar para operaciones funciones eliminar elementos data crear contar concatenar con columnas r indexing match vectorization

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