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
table
de 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 0
También puede usar
apply
ocolSums
en 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 0
fuente
M <- sapply(airquality, function(x) sum(is.na(x))); M[M>0]
M <- colSums(is.na(airquality)); M[M <= 0]
Podemos usar
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
fuente
map_df
oversapply
?map_df( air quality, ~sum(is.na(.) )
map_df
oversapply
es solo cuando el resultado tiene muchas filas, ya que el formato de salida de map_df siempre es tibble.vapply
vssapply
en funciones porquevapply
le brinda una estructura de resultado conocida (que usted especifica).sapply
puede devolver una matriz o una lista, dependiendo de la salida de la función. Una desventaja demap_df
es 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 esNA
sum()
TRUE
es1
,FALSE
es0
fuente
NA
s para todas las columnas en los datosOtra alternativa gráfica:
plot_missing
función de unDataExplorer
paquete 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 elDataExplorer
paquete 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
visdat
paquete ofrecevis_miss
.Muy similar a la
Amelia
salida 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.na10
función de laheatmaply
biblioteca: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_graph
se puede utilizar para explorar los datos del panel:fuente
Una
dplyr
solució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
NA
segú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.5
fuente