2016-09-22 1 views
3

complete.casesまたはanyNAはどちらも1行目でFALSEを返しません。彼らのドキュメントに基づいて、私は間違ったドキュメントを読んでいるのですか?complete.casesとanyNAは行内にNAを検出しませんか?

csv<-data.frame(c(100,50,100),c(1,1,1),c(NA,12,NA)) 
csv$complete<-apply(csv,1,function(x){x[1]==100 && x[2]==1 && complete.cases(x)}) #check that column_1==100, and column_2=1, and no missing values in the row 

csv$complete2<-apply(csv,1,function(x){x[1]==100 && x[2]==1 && anyNA(x, recursive = FALSE)}) 

> csv 
c.100..50..100. c.1..1..1. c.NA..12..NA. complete complete2 
1    100   1   NA  TRUE  TRUE 
2    50   1   12 FALSE  FALSE 
3    100   1   NA  TRUE  TRUE 
+1

あなたはこれを考慮することができます。 'TRUE && complete.cases(c(1,2、NA))'は 'TURE && c(TRUE、TRUE、FALSE)'を返し、 'TRUE'を返します。 '&&'を使うときは最初のTRUEだけが使われていると思いますが、関数の中でallを使って '&'を試すことができます。 – Psidom

+0

'anyNA'は期待通りに動作しているようです(少なくとも1つのNAがあればTRUE、それ以外の場合はFALSE)。 @Psidomが示すように、 'complete.cases'は、行の各要素に対して別々の真理値を持つベクトルを返します。 'isTRUE(c(TRUE、TRUE、FALSE))'は 'FALSE'を返すので、@PsidomはRがそのベクトルの最初の値だけを見ていることが正しいかもしれません。実際、カラム1とカラム3を切り替えると、最初の論理テストは 'FALSE FALSE FALSE'を返します。これは、' complete.cases 'によって返されたベクトルの最初の要素だけが使用されていることを示唆しています。 – eipi10

+0

興味深いですが、なぜ 'anyNA()'を '!isTRUE(anyNA(x、recursive = FALSE))'に置き換えても正しい結果が得られませんか?私は 'isTRUE(anyNA(c(1,2、NA)))'でそれをテストし、期待通りにTRUEを返しました – Rilcon42

答えて

3

あなたの目に最初の明白な異常が&&&の違いを理解するために失敗したことを表しています。

complete.cases(c(100,1,NA)) 
[1] TRUE TRUE FALSE 

&&機能だけに与えられたすべてのベクトルの最初の項目を扱うので、最初の行についてTRUE返さ:匿名関数は、1行目の戻りこの3要素ベクトルを与えられたcomplete.cases 。恐らく警告がここで適切かもしれません。あなたはNA年代の不足のためにテストし、検討中のベクトルであることを起こる何かを望んでいた場合、私はall(!is.na(.))

csv$complete<-apply(csv,1,function(x){x[1]==100 && x[2]==1 && all(!is.na((x)) )}) 

csv$complete2<-apply(csv,1,function(x){x[1]==100 && x[2]==1 && anyNA(x, recursive = FALSE)}) 

> csv 
    c.100..50..100. c.1..1..1. c.NA..12..NA. complete complete2 
1    100   1   NA FALSE  TRUE 
2    50   1   12 FALSE  FALSE 
3    100   1   NA FALSE  TRUE 

を使用しているだろうanyNAがで否定されている必要があります 『!』 if(コンテキストから表示されるように)complete2のすべてが偽であると予想した場合。

関連する問題