2012-07-04 20 views
20

Sto scrivendo una funzione, che ha bisogno di un controllo se (e quale!) Colonna (variabile) ha tutti i valori mancanti (NA, <NA>). Di seguito è frammento della funzione:Trova colonne con tutti i valori mancanti

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 

Q1: Perché è l'errore precedente e le eventuali correzioni?

Q2: Esiste un modo per trovare quale di colonne hanno tutti NA, ad esempio, l'uscita l'elenco (nome del numero variabile o colonna)?

+2

Mi sento come se avessi dovuto rispondere prima: qualcosa come 'nomi (dati) [lapply (dati, funzione (x) tutti (is.na (x)))]' –

+2

Le parentesi sono sbagliate. Scrivi 'colSums (! Is.na (data)) == 0' invece di' colSums (! Is.na (data) == 0) '. – sgibb

risposta

27

Questo è abbastanza facile da con sapply e una piccola funzione anonima:

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 

E all'interno di una funzione:

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

grazie, ho intenzione di mettere come parte della funzione, in modo che la funzione si fermi se ci sono VERO ... che è importante per me dato che ho un grande set di dati con> 50000 variabili – SHRram

+0

@ram Ho modificato la mia risposta per includere l'uso all'interno di una funzione – Andrie

+0

Potresti anche essere in grado di ridurre il numero di calcoli osservando che una colonna composta solo da 'NA' sarà' class' 'logical'. Inoltre, se non ti aspetti altre colonne logiche, questo ti dà le colonne NA. – James

5

per trovare le colonne con tutti i valori mancanti

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, viceversa

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


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

Per verificare se le colonne avere tutti i valori mancanti:

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

Per ottenere le colonne avere tutti i valori mancanti:

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

Il seguito comando g ti dà un bel tavolo con le colonne che hanno NA valori:

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

E 'un miglioramento per la prima risposta che hai, che non funziona correttamente da alcuni casi.

Problemi correlati