¿Cómo combinar múltiples condiciones para subconjuntos de un marco de datos usando "OR"?


Tengo un dato.marco 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 usado la siguiente sintaxis antes con mucho éxito cuando quería usar la condición "Y".

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

Pero no se como usar un 'O' en lo anterior.

Author: Donnied, 2011-02-08

3 answers

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 función:

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

Algunas personas critican el uso de which como no necesario, pero evita que los valores de NA arrojen resultados no deseados. Equivalente (.es decir, no devolver las filas de NA para cualquier NA en V1 o V2) a las dos opciones demostradas anteriormente sin el which sería:

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

Nota: Quiero agradecer al colaborador anónimo que intentó corregir el error en el código inmediatamente anterior, una solución que fue rechazada por los moderadores. En realidad hubo un error adicional que noté cuando estaba corrigiendo el primero. La cláusula condicional que comprueba los valores de NA debe ser la primera si se va a manejar como pretendía, desde entonces ...

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

El orden de los argumentos puede importar cuando se usa '&".

 201
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-07 16:08:19

Usted está buscando"/."Véase http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]
 25
Author: ncray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-08 16:21:53

Solo por el bien de la integridad, podemos usar 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 name name is equivalent to df [["name", exact = FALSE]]

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 para 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
 12
Author: mpalanco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-24 10:19:31