2011-11-29 32 views
55

Aquí hay un pequeño fragmento de código que escribí para informar las variables con valores perdidos de un marco de datos. Estoy tratando de pensar en una forma más elegante de hacer esto, uno que tal vez devuelve una hoja.de.datos, pero estoy atascado:Forma elegante de informar los valores faltantes en un data.frame

for (Var in names(airquality)) { 
    missing <- sum(is.na(airquality[,Var])) 
    if (missing > 0) { 
     print(c(Var,missing)) 
    } 
} 

Editar: estoy tratando con data.frames con docenas de cientos de variables, por lo que es clave que solo informemos variables con valores perdidos.

+5

¿qué hay de 'summary (Data) '? – kohske

+0

@kohske: esa fue mi primera idea, pero los resultados son una "tabla" de caracteres y tendrías que analizar el número de NA. –

+0

Voy a revertir su pregunta, ya que ha publicado una respuesta. Si desea comentar una respuesta, hágalo como comentario a esa respuesta. Si las preguntas también contienen respuestas, esto se vuelve muy confuso. – Andrie

Respuesta

115

sólo tiene que utilizar sapply

> sapply(airquality, function(x) sum(is.na(x))) 
    Ozone Solar.R Wind Temp Month  Day 
    37  7  0  0  0  0 

También es posible usar apply o colSums en la matriz creada por is.na()

> apply(is.na(airquality),2,sum) 
    Ozone Solar.R Wind Temp Month  Day 
    37  7  0  0  0  0 
> colSums(is.na(airquality)) 
    Ozone Solar.R Wind Temp Month  Day 
    37  7  0  0  0  0 
+10

Modifiqué su código ligeramente, para informar solamente el valor perdido: 'M <- sapply (calidad_al aire, función (x) suma (is.na (x))); M [M> 0] ' – Zach

+0

¡Gracias! Aprendió mucho. –

+0

Hola @Joshua Ulrich, muchas gracias por tu sucinto código. Me gustaría agregar una columna en el marco de datos que muestre el porcentaje de valores na. ¿Puedes proporcionar algo de ayuda con respecto a esto? – DukeLover

0

Si desea hacerlo por la columna particular, entonces también puede utilizar este

length(which(is.na(airquality[1])==T)) 
+3

No necesita comparar un vector lógico a T. También puede contar el número de elementos VERDADEROS en un vector lógico al sumarlo. – Houshalter

4

Más succinct-: sum(is.na(x[1]))

Eso es

  1. x[1] mirar a la primera columna

  2. is.na() cierto si se trata de NA

  3. sum()TRUE es 1, FALSE es 0

+0

esto no responde la pregunta original, que es encontrar el número de 'NA's para * todas * columnas en los datos –

2
summary(airquality) 

ya se le da esta información

El VIM paquetes también ofrece algunas buenas trama de datos que falta para hoja.de.datos

library("VIM") 
aggr(airquality) 

enter image description here

+0

¿Puede el paquete VIM informar qué observaciones específicas tienen datos faltantes? –

+0

no lo creo ... pero puede conseguirlo fácilmente (tendría que reemplazar la calidad del aire con su propio marco de datos): res <- airquality [rowSums (is.na (airquality))> 0,] – stats0007

2

Podemos utilizar map_df con purrr.

library(mice) 
library(purrr) 

# map_df with purrr 
map_df(airquality, function(x) sum(is.na(x))) 
# A tibble: 1 × 6 
# Ozone Solar.R Wind Temp Month Day 
# <int> <int> <int> <int> <int> <int> 
# 1 37  7  0  0  0  0 
+0

¿Cuál es la ventaja? de 'map_df' sobre' sapply'? – Zach

+0

@Zach Creo que no hay gran diferencia, pero Hadley dijo que no use sapply() dentro de una función. Ver Excepciones y eliminación de fallas · Advanced R. http://adv-r.had.co.nz/Exceptions-Debugging.html. – Keiku

2

Otra de las funciones que le ayudaría a mirar los datos faltantes sería df_status de la biblioteca funModeling

library(funModeling) 

iris.2 es el conjunto de datos del iris con un poco añadió NAs.You puede sustituir esto con su conjunto de datos.

df_status(iris.2) 

Esto le dará el número y el porcentaje de NA en cada columna.

0

Creo que la biblioteca de Amelia hace un buen trabajo al manejar los datos que faltan, también incluye un mapa para visualizar las filas que faltan.

install.packages("Amelia") 
library(Amelia) 
missmap(airquality) 

enter image description here

También puede ejecutar el siguiente código devolverá los valores lógicos de na

row.has.na <- apply(training, 1, function(x){any(is.na(x))}) 
0

Para una más solución gráfica, visdatpackage ofrece vis_miss.

library(visdat) 
vis_miss(airquality) 

enter image description here

muy similar a Amelia de salida con una pequeña diferencia de dar% s en missings fuera de la caja.

2

Otra alternativa gráfica - plot_missing función de excelente paquete DataExplorer:

enter image description here

Docs también señala que el hecho de que puede guardar este resultado para un análisis adicional con missing_data <- plot_missing(data).

+0

La función 'plot_missing()' en el paquete 'DataExplorer' ahora es' PlotMissing() '. – coip

Cuestiones relacionadas