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 del cuerpo de una función:
new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]
Algunas personas critican el uso de which
como no necesario, pero impide que los NA
valores arrojen resultados no deseados. El equivalente (.ie no devolver filas de NA para ningún 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 contribuyente 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 verifica los valores de NA debe ser primero si se va a manejar como pretendía, ya que ...
> NA & 1
[1] NA
> 0 & NA
[1] FALSE
El orden de los argumentos puede ser importante cuando se usa '& ".
[
uno necesita envolverwhich
o usar!is.na
restricciones adicionales .which
. Si tanto V1 como V2 son NA, obtendría una fila de NA en esa posición si omitiera elwhich
. Trabajo con grandes conjuntos de datos e incluso un porcentaje relativamente pequeño de NA realmente llenará mi pantalla con resultados basura. Algunas personas piensan que esta es una característica. Yo no.grepl
ogrep
con esto para también hacer coincidir patrones para las filas deseadas, además de estos condicionales?Estás buscando "|". Ver http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors
fuente
NA
s en un marco de datos:vc <- data.frame(duzey=factor(c("Y","O","Y","D","Y","Y","O"), levels=c("D","O","Y"), ordered=TRUE), cinsiyet=c("E","E","K",NA,"K","E","K"), yas=c(8,3,9,NA,7,NA,6), Not=c(NA,1,1,NA,NA,2,1)); vc; vc[vc$cinsiyet == "E" | vc$Not < 4,]; vc[vc$cinsiyet == "E" & vc$Not < 2,]
Solo en aras de la integridad, podemos utilizar los operadores
[
y[[
:Varias opciones
df $ name es equivalente a df [["nombre", exacto = FALSO]]
Utilizando
dplyr
:Utilizando
sqldf
:Salida para las opciones anteriores:
fuente
sqldf
paquete es muy bueno. Muy útil, especialmente cuando sesubset()
vuelve un poco doloroso :)