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

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

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

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 partido, tal como lo solicitó. 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 siempre que el primer argumento, con un TRUE si ese valor se puede encontrar en el segundo argumento y un FALSE caso contrario.

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)

Una pequeña nota sobre la eficacia 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]] 

R ha sobrecargado el operador double equals == 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 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 se puede expandir para usar varios vectores también.

    Intereting Posts