modify functions espaƱol empty ejemplos data create crear column r dataframe

functions - Mostrar columnas con NA en un data.frame



r data frame format (3)

Aquí hay una forma:

colnames(tmp)[colSums(is.na(tmp)) > 0]

Espero eso ayude,

Manoel

Me gustaría mostrar los nombres de las columnas en un gran marco de datos que contienen valores perdidos. Básicamente, quiero el equivalente de complete.cases (df) pero para columnas, no filas. Algunas de las columnas son no numéricas, así que algo como

names(df[is.na(colMeans(df))])

devuelve "Error en colMeans (df): ''x'' debe ser numérico". Entonces, mi solución actual es transponer el marco de datos y ejecutar complete.cases, pero supongo que hay una variante de aplicación (o algo en plyr) que es mucho más eficiente.

nacols <- function(df) { names(df[,!complete.cases(t(df))]) } w <- c("hello","goodbye","stuff") x <- c(1,2,3) y <- c(1,NA,0) z <- c(1,0, NA) tmp <- data.frame(w,x,y,z) nacols(tmp) [1] "y" "z"

¿Puede alguien mostrarme una función más eficiente para identificar columnas que tienen NA?


De una sola mano...

nacols <- function(x){ y <- sapply(x, function(xx)any(is.na(xx))) names(y[y]) } nacols(tmp) [1] "y" "z"

Explicación: dado que el resultado y es un vector lógico, los names(y[y]) devuelven los nombres de y solo para aquellos casos en que y es TRUE.


Esta es la forma más rápida que conozco:

unlist(lapply(df, function(x) any(is.na(x))))

EDITAR:

Supongo que todos los demás lo escribieron completo, así que aquí está completo:

nacols <- function(df) { colnames(df)[unlist(lapply(df, function(x) any(is.na(x))))] }

Y si marca las 4 soluciones en una máquina WIN 7:

Unit: microseconds expr min lq median uq max 1 ANDRIE 85.380 91.911 106.375 116.639 863.124 2 MANOEL 87.712 93.778 105.908 118.971 8426.886 3 MOIRA 764.215 798.273 817.402 876.188 143039.632 4 TYLER 51.321 57.853 62.518 72.316 1365.136

Y aquí hay un visual de eso:

Editar En el momento en que escribí esto, no existía o no lo sabía. Esto puede acelerar las cosas más ... según el manual de ayuda de ?anyNA :

La función genérica anyNA implementa any(is.na(x)) de una manera posiblemente más rápida (especialmente para vectores atómicos).

nacols <- function(df) { colnames(df)[unlist(lapply(df, function(x) anyNA(x)))] }