Aquí hay un pequeño fragmento de código que escribí para reportar variables con valores perdidos de un marco de datos. Estoy tratando de pensar en una forma más elegante de hacer esto, una que quizás devuelva un data.frame, pero estoy atascado:
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 decenas a cientos de variables, por lo que es clave que solo informemos las variables con valores perdidos.
r
dataframe
missing-data
Zach
fuente
fuente

tablede caracteres y tendrías que analizar la cantidad de NA.Respuestas:
Solo usa
sapply> sapply(airquality, function(x) sum(is.na(x))) Ozone Solar.R Wind Temp Month Day 37 7 0 0 0 0También puede usar
applyocolSumsen la matriz creada poris.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 0fuente
M <- sapply(airquality, function(x) sum(is.na(x))); M[M>0]M <- colSums(is.na(airquality)); M[M <= 0]Podemos usar
map_dfcon 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 0fuente
map_dfoversapply?map_df( air quality, ~sum(is.na(.) )map_dfoversapplyes solo cuando el resultado tiene muchas filas, ya que el formato de salida de map_df siempre es tibble.vapplyvssapplyen funciones porquevapplyle brinda una estructura de resultado conocida (que usted especifica).sapplypuede devolver una matriz o una lista, dependiendo de la salida de la función. Una desventaja demap_dfes que le da un data.frame como entrada, y devuelve una subclase data.frame, no un data.frame. No hay garantía de que tibbles se comporte como lo hacen data.frames en todos los casos necesarios en el futuro.Mi nuevo favorito para los datos (no demasiado amplios) son los métodos del excelente paquete naniar . No solo obtienes frecuencias, sino también patrones de ausencia:
A menudo es útil ver dónde están las faltas en relación con las que no faltan, lo que se puede lograr trazando un diagrama de dispersión con faltas:
O para variables categóricas:
Estos ejemplos son de la viñeta del paquete que enumera otras visualizaciones interesantes.
fuente
gg_miss_upset()función dedicada en la última versión, que se enviará a CRAN una vez que regresen de las vacaciones. naniar.njtierney.com/reference/gg_miss_upset.htmlya te da esta informacion
Los paquetes VIM también ofrecen un buen diagrama de datos faltantes para data.frame
library("VIM") aggr(airquality)fuente
Más sucinto:
sum(is.na(x[1]))Es decir
x[1]Mira la primera columnais.na()cierto si esNAsum()TRUEes1,FALSEes0fuente
NAs para todas las columnas en los datosOtra alternativa gráfica:
plot_missingfunción de unDataExplorerpaquete excelente :Docs también señala el hecho de que puede guardar estos resultados para un análisis adicional con
missing_data <- plot_missing(data).fuente
plot_missing()función en elDataExplorerpaquete es ahoraPlotMissing().PlotMissing()está obsoleto. Utilice en suplot_missing()lugar. Consulte el n. ° 49 para obtener más detalles.Otra función que lo ayudaría a ver los datos faltantes sería df_status de la biblioteca funModeling
iris.2 es el conjunto de datos de iris con algunos NA añadidos. Puede reemplazarlo con su conjunto de datos.
Esto le dará el número y porcentaje de NA en cada columna.
fuente
Para una solución gráfica más, el
visdatpaquete ofrecevis_miss.Muy similar a la
Ameliasalida con una pequeña diferencia de dar% s en las faltas de la caja.fuente
Creo que la biblioteca Amelia hace un buen trabajo en el manejo de los datos faltantes y también incluye un mapa para visualizar las filas faltantes.
install.packages("Amelia") library(Amelia) missmap(airquality)También puede ejecutar el siguiente código que devolverá los valores lógicos de na
row.has.na <- apply(training, 1, function(x){any(is.na(x))})fuente
Otra forma gráfica e interactiva es usar la
is.na10función de laheatmaplybiblioteca:library(heatmaply) heatmaply(is.na10(airquality), grid_gap = 1, showticklabels = c(T,F), k_col =3, k_row = 3, margins = c(55, 30), colors = c("grey80", "grey20"))Probablemente no funcione bien con grandes conjuntos de datos.
fuente
Si desea hacerlo para una columna en particular, también puede usar este
length(which(is.na(airquality[1])==T))fuente
La función de paquete de ExPanDaR
prepare_missing_values_graphse puede utilizar para explorar los datos del panel:fuente
Una
dplyrsolución para obtener el recuento podría ser:summarise_all(df, ~sum(is.na(.)))O para obtener un porcentaje:
summarise_all(df, ~(sum(is_missing(.) / nrow(df))))Quizás también valga la pena señalar que los datos faltantes pueden ser desagradables, inconsistentes y no siempre están codificados
NAsegún la fuente o cómo se manejan cuando se importan. La siguiente función podría modificarse según sus datos y lo que desee considerar que falta:is_missing <- function(x){ missing_strs <- c('', 'null', 'na', 'nan', 'inf', '-inf', '-9', 'unknown', 'missing') ifelse((is.na(x) | is.nan(x) | is.infinite(x)), TRUE, ifelse(trimws(tolower(x)) %in% missing_strs, TRUE, FALSE)) } # sample ugly data df <- data.frame(a = c(NA, '1', ' ', 'missing'), b = c(0, 2, NaN, 4), c = c('NA', 'b', '-9', 'null'), d = 1:4, e = c(1, Inf, -Inf, 0)) # counts: > summarise_all(df, ~sum(is_missing(.))) a b c d e 1 3 1 3 0 2 # percentage: > summarise_all(df, ~(sum(is_missing(.) / nrow(df)))) a b c d e 1 0.75 0.25 0.75 0 0.5fuente