2016-09-17 2 views
1

Suchen nach einem besseren Weg: Wie kann ich R die Werte einer flexiblen Teilmenge der mehrfachen Spalten Element-weise überprüfen lassen (sagen wir Var2 und Var3 hier) und das Ergebnis schreiben der Prüfung auf eine neue logische Spalte?Mehrfache Datenrahmenspalten gleichzeitig prüfen (flexible Art und Weise)

Gibt es hier einen kürzeren, eleganteren Weg als mit der Reihe apply() hier?

df <- read.csv(
    text = '"Var1","Var2","Var3" 
    "","","" 
    "","","a" 
    "","a","" 
    "a","a","a" 
    "a","","a" 
    "","a","" 
    "","","" 
    "","","a" 
    "","a","" 
    "","","a"' 
) 

criticalColumns <- c("Var2", "Var3") 

df$criticalColumnsAreEmpty <- 
    apply(df[, criticalColumns], 1, function(curRow) { 
    return(all(curRow == "")) 
    }) 

ich könnte dies auch in expliziter Weise tun, aber das ist nicht ein flexibles dann:

df$criticalColumnsAreEmpty <- df$Var2 == "" & df$Var3 == "" 

gewünschte Ausgabe:

Var1 Var2 Var3 criticalColumnsAreEmpty 
            TRUE 
       a     FALSE 
     a      FALSE 
    a a a     FALSE 
    a   a     FALSE 
     a      FALSE 
            TRUE 
       a     FALSE 
     a      FALSE 
       a     FALSE 

Antwort

1

Wir rowSums auf der logischen Matrix verwenden können

df$criticalColumnsAreEmpty <- !rowSums(df[criticalColumns]!="") 
df$criticalColumnsAreEmpty 
#[1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE 

Oder eine andere Option (für große Datensätze Umwandlung zu vermeiden, für die Speicher Gründen Matrix) ist eine Schleife über die Spalten, überprüfen, ob die Elemente sind leer und verwenden Reduce mit &

Reduce(`&`, lapply(df[criticalColumns], function(x) !nzchar(as.character(x))))