En R, tengo un elemento xy un vector v. Quiero encontrar el primer índice de un elemento vque sea igual a x. Sé que una forma de hacerlo es: which(x == v)[[1]]pero parece excesivamente ineficiente. ¿Hay alguna forma más directa de hacerlo?
Para puntos de bonificación, ¿hay una función que funcione si xes un vector? Es decir, debe devolver un vector de índices que indique la posición de cada elemento de xin v.
r
indexing
match
vectorization
Ryan C. Thompson
fuente
fuente

which(x == v)[[1]]no es tan ineficiente. Es un==operador de comparación ( ) aplicado a todos los elementos vectoriales y un subconjunto en los índices (which). Eso es. Nada que deba ser relevante, siempre y cuando no esté ejecutando 10.000 repeticiones en esta función. Otras soluciones tienen gustomatchyPositionpueden no devolver tantos datos comowhich, pero no son necesariamente más eficientes.which(x == v)[[1]]no lo es.Respuestas:
La función
matchfunciona en vectores:matchsolo devuelve el primer encuentro de un partido, como lo solicitó. Devuelve la posición en el segundo argumento de los valores en el primer argumento.Para la coincidencia múltiple, este
%in%es el camino a seguir:%in%devuelve un vector lógico siempre que el primer argumento, con unTRUEvalor de si ese se puede encontrar en el segundo argumento y un valor diferenteFALSE.fuente
matchimportante si desea el índice de la primera aparición. Para su ejemplo,match(x,c(4,8))da resultados diferentes, lo cual no es súper obvio al principio.match. Todo se explica allí. Pero agregué esa información.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)fuente
Una pequeña nota sobre la eficiencia de los métodos mencionados anteriormente:
Entonces, el mejor es
fuente
which("Feb" == month.abb)devuelve2–por[[1]]qué el ?which(x == v)[[1]], pero que parece excesivamente ineficiente".R ha sobrecargado al
==operador de doble igual con un método para encontrar el índice de una aguja en un pajar de vectores. Produce unlogicalvector que contieneTRUEvalores para cada coincidencia en el pajar.Ejemplo:
Funciona si ambos son vectores, y puede expandirse para usar también múltiples vectores.
fuente
==operador ya fue mencionado en mi pregunta como una solución ineficiente que no funciona con un vector de agujas.FALSE FALSE TRUE FALSE TRUEeste ejemplo==devuelve un vector lógico, no índices. Para eso necesitaswhich(), como te expliqué hace 7 años.