¿Cómo subconjunto de datos en R sin perder filas de NA?
dataframe subset (2)
Si decidimos usar la función de
subset
, entonces debemos tener cuidado:
For ordinary vectors, the result is simply ‘x[subset & !is.na(subset)]’.
Por lo tanto, solo se retendrán los valores que no sean NA.
Si desea conservar los casos de
NA
, use lógica o condición para decirle a R que no descarte los casos de
NA
:
subset(df1, Height < 40 | is.na(Height))
# or `df1[df1$Height < 40 | is.na(df1$Height), ]`
No use directamente (se explicará pronto):
df2 <- df1[df1$Height < 40, ]
Ejemplo
df1 <- data.frame(Height = c(NA, 2, 4, NA, 50, 60), y = 1:6)
subset(df1, Height < 40 | is.na(Height))
# Height y
#1 NA 1
#2 2 2
#3 4 3
#4 NA 4
df1[df1$Height < 40, ]
# Height y
#1 NA NA
#2 2 2
#3 4 3
#4 NA NA
La razón por la que este último falla es que la indexación por
NA
da
NA
.
Considere este ejemplo simple con un vector:
x <- 1:4
ind <- c(NA, TRUE, NA, FALSE)
x[ind]
# [1] NA 2 NA
Necesitamos reemplazar de alguna manera esos
NA
con
TRUE
.
La forma más directa es agregar otra condición "o"
is.na(ind)
:
x[ind | is.na(ind)]
# [1] 1 2 3
Esto es exactamente lo que sucederá en su situación.
Si su
Height
contiene
NA
, entonces la operación lógica
Height < 40
termina en una mezcla de
TRUE
/
FALSE
/
NA
, por lo que necesitamos reemplazar
NA
por
TRUE
como se
TRUE
anteriormente.
Tengo algunos datos que estoy viendo en R. Una columna en particular, titulada "Altura", contiene algunas filas de NA.
Estoy buscando subconjuntar mi marco de datos para que todas las Alturas por encima de un cierto valor se excluyan de mi análisis.
df2 <- subset ( df1 , Height < 40 )
Sin embargo, cada vez que hago esto, R elimina automáticamente todas las filas que contienen valores de NA para Altura. No quiero esto. He intentado incluir argumentos para na.rm
f1 <- function ( x , na.rm = FALSE ) {
df2 <- subset ( x , Height < 40 )
}
f1 ( df1 , na.rm = FALSE )
pero esto no parece hacer nada; las filas con NA todavía terminan desapareciendo de mi marco de datos. ¿Hay alguna manera de subconjugar mis datos como tales, sin perder las filas de NA?
También puedes hacer:
df2 <- df1[(df1$Height < 40 | is.na(df1$Height)),]