2016-09-17 2 views
1

Ищете лучший способ: как я могу заставить R проверять значения гибкого подмножества нескольких столбцов по элементам (скажем, Var2 и Var3 здесь) и написать результат проверки в новый логический столбец?Проверка нескольких столбцов кадра данных сразу (гибко)

Есть ли более короткий, более элегантный способ, чем использование row-wise apply() здесь?

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 == "")) 
    }) 

Я мог бы также сделать это в явном виде, но это не является гибким, то:

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

Желаемый результат:

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 

ответ

1

Мы можем использовать rowSums на логической матрице

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

Или другой вариант (для больших наборов данных, чтобы избежать преобразований в матрицу по причинам памяти) является циклом по столбцам, проверьте пустые элементы и использовать Reduce с &

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

 Смежные вопросы

  • Нет связанных вопросов^_^