Encontrar todas las posiciones de elementos múltiples en un vector
Pregunta
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 saber qué elementos son 8 o 9?
Solución
Esta es una manera de hacerlo. En primer lugar consigo los índices en los que x es 8 o 9. A continuación, podemos comprobar 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
Otros consejos
Usted podría intentar el operador |
para condiciones cortos
which(x == 8 | x == 9)
este caso específico también se puede utilizar 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 se desea detectar número con más de un dígito, se prefiere la segunda opción:
> grep('10|8',x)
[1] 1 12 18 19
Sin embargo, he puesto énfasis en este caso específico en el inicio de mi respuesta por una razón. Como se mencionó @DavidArenburg , esto podría conducir a resultados no deseados. Utilizando por ejemplo grep('1|8',x)
detectará tanto 1
y 10
:
> grep('1|8',x)
[1] 1 10 12 18 19
Con el fin de evitar que el efecto secundario, tendrá que ajustar los números para detectar en palabras-bounderies:
> grep('\\b1\\b|8',x)
[1] 1 10 12 19
Ahora, el 10
no se detecta.
Como alternativa, si no es necesario utilizar los índices, pero sólo los elementos que se pueden 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
tal vez una función útil. Tenga en cuenta que grepl
aparece en versiones de R 2.9.0 y posteriores. Lo que es muy útil sobre 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, usted podría hacer lo siguiente
grepl(8,x) | grepl(9,x)