2011-04-07 15 views
196

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 hacerlo es: which(x == v)[[1]], pero eso parece excesivamente ineficiente. ¿Hay una forma más directa de hacerlo?¿Hay una función R para encontrar el índice de un elemento en un vector?

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 en v.

+0

Como R está optimizado para trabajar con vectores, 'que (x == v) [[1]]' no es tan ineficiente. Es un operador de comparación ('==') aplicado a todos los elementos del vector y un subconjunto en los índices ('que'). Eso es. Nada que debería ser relevante, siempre y cuando no ejecute 10.000 repeticiones en esta función. Es posible que otras soluciones como 'match' y' Position' no devuelvan tantos datos como 'which', pero no necesariamente son más eficientes. – BurninLeo

+1

Mi pregunta especificaba que preferiría una función que fue vectorizada sobre x, y 'que (x == v) [[1]]' no. –

Respuesta

279

La función match obras de 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 sólo devuelve el primer encuentro de un partido, como usted solicitó. Devuelve la posición en el segundo argumento de los valores en el primer argumento.

Por 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ógica, siempre que el primer argumento, con un TRUE si ese valor se puede encontrar en el segundo argumento y una FALSE de otra manera.

+0

Creo que un ejemplo con c (2,3,3) yc (1,2,3,4) con coincidencia y% en% sería más instructivo con menos cambios entre los ejemplos. match (c (2,3,3), c (1: 4)) devuelve resultados diferentes de los cuales (c (2,3,3)% en% c (1: 4)) sin necesidad de un primer vector más largo y como muchos cambios de ejemplo a ejemplo. También vale la pena señalar que manejan no partidos de manera muy diferente. – John

+1

@John: eso es cierto, pero eso no es lo que pidió el OP. El OP preguntó, comenzando desde un vector largo, para encontrar el primer partido de elementos dados en otro. Y para completar, agregué que si está interesado en todos los índices, tendrá que usar cuál (% en%). Por cierto, no hay ninguna razón para eliminar tu respuesta. Es información válida. –

+0

Es información válida pero se ha ido ...:) – John

19

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)

3

R ha sobrecargado los dobles iguales == operador con un método de encontrar el índice de una aguja en un pajar vector. Produce un vector logical, que contiene TRUE valores 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 ampliar para utilizar múltiples vectores también.

+1

El operador '==' ya se mencionó en mi pregunta como una solución ineficiente que no funciona con un vector de agujas. –

+0

"funciona si ambos son vectores" - tal vez, dependiendo de lo que signifique ... pero no en el sentido que el OP quería. – Frank

+10

Obtengo 'FALSE FALSE TRUE FALSE TRUE' en lugar de índices en este ejemplo –

Cuestiones relacionadas