2012-07-04 19 views
20

Estoy escribiendo una función, que necesita una comprobación de si (y qué!) La columna (variable) tiene todos los valores faltantes (NA, <NA>). El siguiente es un fragmento de la función:Buscar columnas con todos los valores faltantes

test1 <- data.frame (matrix(c(1,2,3,NA,2,3,NA,NA,2), 3,3)) 
test2 <- data.frame (matrix(c(1,2,3,NA,NA,NA,NA,NA,2), 3,3)) 

na.test <- function (data) { 
    if (colSums(!is.na(data) == 0)){ 
     stop ("The some variable in the dataset has all missing value, 
    remove the column to proceed") 
     } 
     } 
na.test (test1) 

Warning message: 
In if (colSums(!is.na(data) == 0)) { : 
    the condition has length > 1 and only the first element will be used 

P1: ¿Por qué es el error anterior y las correcciones?

Q2: ¿Hay alguna manera de encontrar cuál de las columnas tiene NA, por ejemplo la lista de salida (nombre de la variable o número de columna)?

+2

Creo que esto debe haber sido respondido antes: algo así como 'names (data) [lapply (data, function (x) all (is.na (x)))]' –

+2

Sus paréntesis son incorrectos. Escriba 'colSums (! Is.na (data)) == 0' en lugar de' colSums (! Is.na (data) == 0) '. – sgibb

Respuesta

27

Esto es bastante fácil con sapply y una pequeña función anónima:

sapply(test1, function(x)all(is.na(x))) 
    X1 X2 X3 
FALSE FALSE FALSE 

sapply(test2, function(x)all(is.na(x))) 
    X1 X2 X3 
FALSE TRUE FALSE 

Y dentro de una función:

na.test <- function (x) { 
    w <- sapply(x, function(x)all(is.na(x))) 
    if (any(w)) { 
    stop(paste("All NA in columns", paste(which(w), collapse=", "))) 
    } 
} 

na.test(test1) 

na.test(test2) 
Error in na.test(test2) : All NA in columns 2 
+0

gracias, intento aquí poner como parte de la función, para que la función se detenga si hay CIERTO ... lo cual es importante para mí, ya que tengo un gran conjunto de datos con> 50000 variables – SHRram

+0

@ram He editado mi respuesta para incluir el uso dentro de una función – Andrie

+0

También puede reducir el número de cálculos al observar que una columna compuesta solo por 'NA' será de' clase' 'lógica'. Además, si no espera ninguna otra columna lógica, esto le da las columnas NA. – James

5

para encontrar las columnas con todos los valores que faltan

allmisscols <- apply(dataset,2, function(x)all(is.na(x))); 
colswithallmiss <-names(allmisscols[allmisscols>0]);  
print("the columns with all values missing");  
print(colswithallmiss); 
6

I n dplyr

ColNums_NotAllMissing <- function(df){ # helper function 
    as.vector(which(colSums(is.na(df)) != nrow(df))) 
} 

df %>% 
select(ColNums_NotAllMissing(.)) 

example: 
x <- data.frame(x = c(NA, NA, NA), y = c(1, 2, NA), z = c(5, 6, 7)) 

x %>% 
select(ColNums_NotAllMissing(.)) 

o, a la inversa

Cols_AllMissing <- function(df){ # helper function 
    as.vector(which(colSums(is.na(df)) == nrow(df))) 
} 


x %>% 
    select(-Cols_AllMissing(.)) 
1

Para probar si las columnas tienen todos los valores faltantes:

apply(test1,2,function(x) {all(is.na(x))}) 

Para obtener las columnas que tienen todos los valores faltantes:

test1.nona <- test1[ , colSums(is.na(test1)) == 0] 
0

El followin g comando le da una buena mesa con las columnas que tienen valores de NA:

sapply(dataframe, function(x)all(any(is.na(x)))) 

es una mejora para la primera respuesta que recibió, que no funciona correctamente desde algunos casos.

Cuestiones relacionadas