2010-11-17 10 views
7

En R, supongamos que tenemos un vector
area = c(rep(c(26:30), 5), rep(c(500:504), 5), rep(c(550:554), 5), rep(c(76:80), 5)) y otro vector yield = c(1:100).
Ahora, decir que quiero índice de este modo:En R: vectores de indexación por comparación booleano de un valor en el rango: Índice == C (min: max)

> yield[area==27] 
[1] 2 7 12 17 22 
> yield[area==501] 
[1] 27 32 37 42 47 

No hay problema, ¿verdad? Pero cosas extrañas comienzan a suceder cuando trato de indexar usando c(A, B). (Y aún más extraño cuando intento c(min:max) ...)

> yield[area==c(27,501)] 
[1] 7 17 32 42 

Lo que estoy esperando es, por supuesto, las instancias que están presentes en ambos de los otros ejemplos, no sólo algunos extraña combinación de ellos. Esto funciona cuando puedo usar el operador OR de tubería:

> yield[area==27 | area==501] 
[1] 2 7 12 17 22 27 32 37 42 47 

¿Pero y si estoy trabajando con un rango? Digamos que quiero indexarlo por el rango c(27:503)? En mi ejemplo real hay muchos más puntos de datos y rangos, por lo que tiene más sentido, por favor, no sugieren lo hago con la mano, lo que esencialmente significa:

yield[area==27 | area==28 | area==29 | ... | area==303 | ... | area==500 | area==501] 

Tiene que haber una mejor manera. ..

Respuesta

6

Quiere usar %in%. También tenga en cuenta que c(27:503) y 27:503 producen el mismo objeto.

> yield[area %in% 27:503] 
[1] 2 3 4 5 7 8 9 10 12 13 14 15 17 
[14] 18 19 20 22 23 24 25 26 27 28 29 31 32 
[27] 33 34 36 37 38 39 41 42 43 44 46 47 48 
[40] 49 76 77 78 79 80 81 82 83 84 85 86 87 
[53] 88 89 90 91 92 93 94 95 96 97 98 99 100 
+0

Impresionante, gracias :) Además, ¿dónde está esto documentado? ¿Cómo se supone que debo encontrarlo sin preguntar? ¿De qué le pido ayuda? La ayuda inútil que yo llamo: P – gakera

+0

@gakera: está en '? Match'. Se supone que debes encontrarlo adivinando mejores palabras clave o leyendo el manual de referencia completo. :-P Creo que primero encontré 'match' a través de la sección" Ver también "de'? Grep'. –

+0

Jaja, adivinando mejores palabras clave o leyendo el manual completo, ¡me encanta! R es tan fácil de usar: D Gracias de nuevo. – gakera

1

¿Por qué no utilizar el subconjunto?

subset(yield, area > 26 & area < 504) ## for indexes 
subset(area, area > 26 & area < 504) ## for values 
+0

¿Por qué no usarlo? Una razón: prestar atención a la sección Advertencia en '? Subconjunto', ya que' rendimiento [área> 26 y área <504] 'es equivalente. –

+0

¿Qué sección de advertencia? –

+1

Advertencia: esta es una función de conveniencia diseñada para su uso de forma interactiva. Para la programación, es mejor utilizar las funciones de subconjunto estándar como '[', y en particular la evaluación no estándar del argumento 'subconjunto' puede tener consecuencias imprevistas. –

Cuestiones relacionadas