Cómo subconjuntar datos en R sin perder filas de NA?

Tengo algunos datos que estoy viendo en R. Una columna en particular, titulada “Altura”, contiene algunas filas de NA.

Estoy buscando subconjunto mi dataframe 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 la 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 dataframe. ¿Hay alguna forma de subdividir mis datos como tal, sin perder las filas de NA?

Si decidimos usar la función subset , entonces debemos tener cuidado:

 For ordinary vectors, the result is simply 'x[subset & !is.na(subset)]'. 

Por lo tanto, solo se conservarán los valores que no sean de NA.

Si desea conservar los casos de NA , use la condición lógica o de condición para decirle a R que no deje caer los casos de NA :

 subset(df1, Height < 40 | is.na(Height)) # or `df1[df1$Height < 40 | is.na(df1$Height), ]` 

No usar directamente (para ser explicado 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 cual este último falla es que la indexación por NA da NA . Considera este simple ejemplo con un vector:

 x <- 1:4 ind <- c(NA, TRUE, NA, FALSE) x[ind] # [1] NA 2 NA 

Necesitamos de alguna manera reemplazar 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 arriba.

También podrías hacer:

 df2 <- df1[(df1$Height < 40 | is.na(df1$Height)),]