Encontrar todas las posiciones para múltiples elementos en un vector

Supongamos que tengo el siguiente vector:

x <- c(8, 6, 9, 9, 7, 3, 2, 5, 5, 1, 6, 8, 5, 2, 9, 3, 5, 10, 8, 2) 

¿Cómo puedo encontrar qué elementos son 8 o 9?

Esta es una manera de hacerlo. Primero obtengo los índices en los que x es 8 o 9. Entonces podemos verificar que en esos índices, x es de hecho 8 y 9.

 > inds < - which(x %in% c(8,9)) > inds [1] 1 3 4 12 15 19 > x[inds] [1] 8 9 9 8 9 8 

Podrías probar el | operador para condiciones cortas

 which(x == 8 | x == 9) 

En este caso específico también puedes usar grep :

 # option 1 grep('[89]',x) # option 2 grep('8|9',x) 

que ambos dan:

 [1] 1 3 4 12 15 19 

Cuando también desee detectar números con más de un dígito, se prefiere la segunda opción:

 > grep('10|8',x) [1] 1 12 18 19 

Sin embargo, puse énfasis en este caso específico al comienzo de mi respuesta por una razón. Como se mencionó en @DavidArenburg , esto podría generar resultados no deseados. Usando por ejemplo grep('1|8',x) detectará tanto 1 como 10 :

 > grep('1|8',x) [1] 1 10 12 18 19 

Para evitar ese efecto secundario, deberá envolver los números que se detectarán en los bounderies de palabras:

 > grep('\\b1\\b|8',x) [1] 1 10 12 19 

Ahora, el 10 no se detecta.

Alternativamente, si no necesita usar los índices sino solo los elementos que puede hacer

 > x < - sample(1:10,20,replace=TRUE) > x [1] 6 4 7 2 9 3 3 5 4 7 2 1 4 9 1 6 10 4 3 10 > x[8< =x & x<=9] [1] 9 9 

grepl quizás una función útil. Tenga en cuenta que grepl aparece en versiones de R 2.9.0 y posteriores. Lo útil de grepl es que devuelve un vector lógico de la misma longitud que x .

 grepl(8, x) [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [13] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE grepl(9, x) [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE [13] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE 

Para llegar a su respuesta, podría hacer lo siguiente

 grepl(8,x) | grepl(9,x)