¿Cómo combinar múltiples condiciones para subconjuntos de un dataframe usando “O”?

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 syntax con mucho éxito cuando quería usar la condición “Y”.

my.data.frame  2) & (data$V2 < 4), ] 

Pero no sé cómo usar un ‘OR’ en lo anterior.

 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 la inclusión dentro de un cuerpo de función:

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

Algunas personas critican el uso del which no es necesario, pero evita que los valores de NA arrojen resultados no deseados. El equivalente (es decir, no devuelve filas 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. Hubo un error adicional que noté cuando estaba corrigiendo el primero. La cláusula condicional que verifica los valores de NA debe ser la primera si se va a manejar como yo quería, ya que ...

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

El orden de los argumentos puede importar al usar '& ".

Usted está buscando “|”. Ver http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors

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

Solo para completar, 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 es equivalente a df [["nombre", exacto = 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 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