2011-11-02 7 views
55

Tenemos un marco de datos de un archivo CSV. El marco de datos DF tiene columnas que contienen valores observados y una columna (VaR2) que contiene la fecha en la que se tomó una medición. Si la fecha no se registró, el archivo CSV contiene el valor NA, para los datos faltantes.Subconjunto de filas que contienen valores de NA (faltantes) en una columna elegida de un marco de datos

Var1 Var2 
10 2010/01/01 
20 NA 
30 2010/03/01 

Nos gustaría utilizar el comando subconjunto de definir un nuevo marco de datos new_DF tal que sólo contiene filas que tienen un valor NA' de la columna (VaR2). En el ejemplo dado, solo la Fila 2 estará contenida en el nuevo DF.

El comando

new_DF<-subset(DF,DF$Var2=="NA") 

no funciona, la trama de datos resultante no tiene entradas de fila.

Si en el archivo CSV original se intercambia el valor NA con NULL, el mismo comando produce el resultado deseado: new_DF<-subset(DF,DF$Var2=="NULL").

¿Cómo puedo hacer que este método funcione, si para la cadena de caracteres se proporciona el valor NA en el archivo CSV original?

Respuesta

92

Nunca use == 'NA' para comprobar si faltan valores. Use is.na() en su lugar. Esto debe hacerlo:

new_DF <- DF[rowSums(is.na(DF)) > 0,] 

o en caso de que desee comprobar una columna en particular, también se puede utilizar

new_DF <- DF[is.na(DF$Var),] 

En caso de que tenga NA valores de carácter, la primera carrera

Df[Df=='NA'] <- NA 

para reemplazarlos por valores perdidos.

+2

Gracias por su rápida respuesta (esto fue rápido)!De hecho, debido a la entrega de csv de los datos, los 'NA' son valores de caracteres y su segunda declaración puede ser muy útil. ¿Puedes aclarar tu primera declaración? El uso de rowSums() no es claro para mí, ya que solo veré una columna en particular (hay muchas columnas). Si esa columna en particular (en el ejemplo sería la columna Var2) tiene una cadena de caracteres 'NA' (la reemplazaré con su segunda declaración), entonces me gustaría elegir toda la fila para ser parte del nuevo marco de datos . – John

+0

@John: actualizado. El punto es usar is.na, interpreté erróneamente que quería verificar todas las variables. –

+3

debería ser 'new_DF <- DF [is.na (DF $ Var),]', es decir, parece haber un '(' paréntesis después de 'DF ['? – PatrickT

34

NA es un valor especial en R, no mezcle el valor NA con la cadena "NA". Dependiendo de la forma en que se importaron los datos, sus celdas "NA" y "NULL" pueden ser de varios tipos (el comportamiento predeterminado es convertir cadenas "NA" a valores NA, y dejar cadenas "NULAS" como están).

Si utiliza read.table() o read.csv(), debe considerar el argumento "na.strings" para hacer la importación de datos limpios, y siempre trabajar con valores R NA reales.

Un ejemplo, trabajando en ambos casos las células "NA" "NULL" y:

DF <- read.csv("file.csv", na.strings=c("NA", "NULL")) 
new_DF <- subset(DF, is.na(DF$Var2)) 
+1

Gracias por su respuesta. Si lo entiendo correctamente la primera afirmación haría lo mismo que Df [Df == 'NA'] <- NA en el ejemplo de Joris? La (pequeña) diferencia entonces sería que se hace en su declaración directamente al comienzo, cuando el marco de datos es creado (este es un método de programación muy limpio y por eso me gusta). – John

+0

Exactamente. Joris sugirió reemplazar cadenas "NA" por valores de NA manualmente, aquí solo sugiero usar la función "na.strings" de read.table() para lograr el mismo propósito. – maressyl

+0

La respuesta de Joris es realmente la forma "preferida" de lograr esta hazaña (si está escribiendo esto en un guión). Consulte: http://stackoverflow.com/questions/9860090/in- r-por-qué-es-mejor-que-subconjunto – Jonathan

-1

Prints todas las filas con datos NA:

tmp <- data.frame(c(1,2,3),c(4,NA,5)); 
tmp[round(which(is.na(tmp))/ncol(tmp)),] 
+0

@ZheyuanLi Si no te gusta la respuesta, simplemente baja la votación. Editar la respuesta para recomendar marcar no es la acción adecuada. Deja un comentario si sientes la necesidad de hacerlo. –

5

complete.cases da TRUE cuando todos los valores en una fila no son NA

DF[!complete.cases(DF), ] 
+0

Con mucho, el más rápido. –

1

Intente cambiar esto:

new_DF<-dplyr::filter(DF,is.na(Var2)) 
+0

¿Podría explicar por qué funciona esto, qué hace esto, etc.? – csilk

+0

new_DF <-dplyr :: filter (DF, is.na (Var2)) básicamente utiliza la función de filtro del paquete dplyr y filtra cualquier observación en la columna Var2 que satisfaga la condición is.na es decir, eligen todas las observaciones con NA – drhnis

+0

Más bellamente expresado como 'DF%>% filter (is.na (Var2))' después de 'library (dplyr)'. – Joe

Cuestiones relacionadas