2011-02-08 19 views
123

Tengo un data.frame en R. Quiero probar dos condiciones diferentes en dos columnas diferentes, pero quiero que estas condiciones sean inclusivas. Por lo tanto, me gustaría usar "O" para combinar las condiciones. He utilizado la siguiente sintaxis con mucho éxito cuando quería usar la condición "Y".¿Cómo combinar varias condiciones para subconjunto de un marco de datos usando "O"?

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ] 

Pero no sé cómo utilizar un 'OR' en el cuadro anterior.

+161

En lugar de mostrarse irritable con preguntas "básicas" como esta, véanlas como una oportunidad para mejorar Internet. El jugo de Google de SO es fuerte, y cada vez que una pregunta de SO reemplaza a una horrenda pregunta de listserv del 2004, un ángel obtiene sus alas. – Andrew

+0

Creo que el desprestigio de las listas de servidores es un perjuicio para las personas que buscan aprender a buscar. La gente debería considerar usar un buen motor de búsqueda para preguntas especializadas. Mi elección es http://markmail.org/search/?q=list%3Aorg.r-project pero otros pueden elegir Rseek.org. –

+6

Creo que los comentarios despectivos que menosprecian las listas de servidores son un perjuicio para las personas que buscan leer comentarios sin menosprecio – hedgedandlevered

Respuesta

178
my.data.frame <- subset(data , V1 > 2 | V2 < 4) 

Una solución alternativa que imita el comportamiento de esta función y sería más apropiada para su inclusión dentro de un cuerpo de la función:

new.data <- data[ which(data$V1 > 2 | data$V2 < 4) , ] 

Algunas personas critican el uso de which que no necesario, pero evita que los valores NA arrojen resultados no deseados. El equivalente (.ie no regresaba NA-filas para cualquier de NA en V1 o V2) de las dos opciones se demostró anteriormente sin la which sería:

new.data <- data[ !is.na(data$V1 | data$V2) & (data$V1 > 2 | data$V2 < 4) , ] 

Nota: Quiero dar las gracias al colaborador anónimo que intentó solucionar el error en el código inmediatamente anterior, una solución que fue rechazada por los moderadores. Hubo un error adicional que noté cuando estaba corrigiendo el primero. La cláusula condicional que comprueba los valores de NA debe ser primero si ha de ser manejado como era mi intención, ya que ...

> NA & 1 
[1] NA 
> 0 & NA 
[1] FALSE 

Orden de argumentos puede importar cuando el uso de '&".

+0

Esta es la pregunta más votada y luego se encuentra: http://stackoverflow.com/questions/9860090/in-r-why-is-better-than-subset – PatrickT

+1

La ventaja es compacta y fácil de comprender. La desventaja es la falta de utilidad en las tareas de creación de funciones. Si uno quiere replicar esto con '[' uno necesita envolver 'which' o usar restricciones'! Is.na' adicionales. –

+0

¿Se requiere 'qué' y, de no ser así, por qué lo usa? – Cleb

8

Sólo por a mayor abundamiento, podemos utilizar los operadores [ y [[:

set.seed(1) 
df <- data.frame(v1 = runif(10), v2 = letters[1:10]) 

Varias opciones

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ] 

df $ nombre es equivalent to df [[ "nombre", exacta = FALSO]]

Usando dplyr:

library(dplyr) 
filter(df, v1 < 0.5 | v2 == "g") 

Usando sqldf:

library(sqldf) 
sqldf('SELECT * 
     FROM df 
     WHERE v1 < 0.5 OR v2 = "g"') 

salida de las opciones anteriores :

  v1 v2 
1 0.26550866 a 
2 0.37212390 b 
3 0.20168193 e 
4 0.94467527 g 
5 0.06178627 j 
+0

cómo harías esto para 1 Y condición y 3 O condiciones contingentes así que por ejemplo: my.data.frame <- data [data $ V3> 10 & ((data $ V1> 2) | (data $ V2 <4) | (data $ V4 <5),]. Cuando hago esto no funciona –

+0

Wow! El paquete 'sqldf' es demasiado bueno. Muy útil especialmente cuando' subconjunto() 'se pone un poco doloroso :) – Dawny33

Cuestiones relacionadas