2012-07-04 15 views
20

Ich schreibe eine Funktion, die überprüft, ob (und welche!) Spalte (Variable) alle fehlenden Werte hat (NA, <NA>). Das folgende Fragment der Funktion:Suche nach Spalten mit allen fehlenden Werten

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: Warum ist der obige Fehler und alle Korrekturen?

Q2: Gibt es eine Möglichkeit zu finden, welche der Spalten haben alle NA, zum Beispiel die Liste ausgeben (Name der Variablen oder Spalte Nummer)?

+2

Ich glaube, das muss zuvor beantwortet worden sein: so etwas wie 'Namen (Daten) [lapply (Daten, Funktion (x) alle (is.na (x)))]] –

+2

Ihre Klammern sind falsch. Schreibe 'colSums (! Is.na (data)) == 0' anstelle von' colSums (! Is.na (data) == 0) '. – sgibb

Antwort

27

Dies ist leicht genug, um mit sapply und einer kleinen anonymen Funktion:

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 

Und in einer Funktion:

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

danke, ich beabsichtige hier als Teil der Funktion, so dass die Funktion zu stoppen, wenn es irgendwelche TRUE ... das ist wichtig für mich, wie ich große Datenmenge mit> 50000 Variablen – SHRram

+0

@ram habe ich meine Antwort zu verwenden innerhalb einer Funktion – Andrie

+0

Sie können auch die Anzahl der Berechnungen reduzieren, indem Sie beachten, dass eine Spalte, die nur 'NA' enthält, von' class' 'logisch' ist. Wenn Sie keine anderen logischen Spalten erwarten, erhalten Sie die NA-Spalten. – James

5

Um die Spalten mit allen Werten zu finden fehlende

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(.)) 

oder, um in die andere Richtung

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


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

Um zu testen, ob Spalten alle fehlenden Werte:

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

zu erhalten, die Spalten alle fehlenden Werte:

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

Die folgenden g Befehl gibt Ihnen eine schöne Tabelle mit den Spalten, die Werte haben NA:

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

Es ist eine Verbesserung für die erste Antwort, die Sie erhalten, die nicht richtig von einigen Fällen funktioniert.

Verwandte Themen