¿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.
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 '&".
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), ]
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
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