Encontrando todas as posições para vários elementos em um vetor

Suponha que eu tenha o seguinte vetor:

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

Como posso encontrar quais elementos são 8 ou 9?

Esta é uma maneira de fazer isso. Primeiro eu obtenho os índices em que x é 8 ou 9. Então podemos verificar que nesses índices, x é de fato 8 e 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 

Você poderia tentar o | operador para condições curtas

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

Neste caso específico, você também pode usar o grep :

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

que ambos dão:

 [1] 1 3 4 12 15 19 

Quando você também quiser detectar um número com mais de um dígito, a segunda opção é a preferida:

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

No entanto, eu coloquei ênfase neste caso específico no início da minha resposta por uma razão. Como o @DavidArenburg mencionou , isso poderia levar a resultados não intencionais. Usando, por exemplo, grep('1|8',x) detectará ambos 1 e 10 :

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

Para evitar esse efeito colateral, você terá que agrupar os números a serem detectados em limites de palavras:

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

Agora, os 10 não são detectados.

Alternativamente, se você não precisa usar os índices, mas apenas os elementos que você pode fazer

 > 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 talvez uma function útil. Observe que o grepl aparece nas versões do R 2.9.0 e posterior. O que é útil sobre o grepl é que ele retorna um vetor lógico do mesmo comprimento 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 chegar à sua resposta, você poderia fazer o seguinte

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