En R, tengo un elemento x
y un vector v
. Quiero encontrar el primer índice de un elemento v
que 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 x
es un vector? Es decir, debe devolver un vector de índices que indique la posición de cada elemento de x
in 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 gustomatch
yPosition
pueden no devolver tantos datos comowhich
, pero no son necesariamente más eficientes.which(x == v)[[1]]
no lo es.Respuestas:
La función
match
funciona en vectores:match
solo 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 unTRUE
valor de si ese se puede encontrar en el segundo argumento y un valor diferenteFALSE
.fuente
match
importante 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
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)
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 unlogical
vector que contieneTRUE
valores 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 TRUE
este ejemplo==
devuelve un vector lógico, no índices. Para eso necesitaswhich()
, como te expliqué hace 7 años.