2016-09-17 4 views
1

もっと良い方法を探してみましょう:複数の列のフレキシブルなサブセットの値を要素単位でチェックする方法はありますか(結果はVar2Var3となります)小切手の新しい論理列に?複数のデータフレーム列を一度にチェックする(柔軟な方法)

ここで行方式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)))) 
関連する問題