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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top