2012-01-18 13 views
8

Rのif-elseループで何が問題なのか教えていただけますか?私はしばしばif-elseループを動作させることができません。私はエラーが発生します:単純なif-elseループのR

if(match('SubjResponse',names(data))==NA) { 
    observed <- data$SubjResponse1 
} 
else { 
    observed <- data$SubjResponse 
} 

dataはデータフレームです。

エラーこれは、我々はデータを持っていないが、私はこれらの問題を参照として完全な例ではありません

Error in if (match("SubjResponse", names(data)) == NA) { : 
    missing value where TRUE/FALSE needed 

答えて

2

@DirkEddelbuettelが指摘したように、NAをそのようにテストすることはできません。しかし、あなたはmatchNAを返さないことができます。

nomatch=0を使用し、(0FALSEとして扱われているので)if句を逆にすることにより、コードを簡略化することができます。さらに、別の有用なコーディングイディオムはif節、あなたは枝の一つに変数名の入力を間違えないであろうその方法の結果を割り当てることです...

だから私はこのようにそれを記述します

あなたは「頻繁に」、あなたは二つのことに注意する必要がある場合は、それ以外に問題がある場合はところで
observed <- if(match('SubjResponse',names(data), nomatch=0)) { 
    data$SubjResponse # match found 
} else { 
    data$SubjResponse1 # no match found 
} 

  1. (文字列をNAまたはNaNを含むか、あってはならないテストへのオブジェクトモード文字)、または論理値に強制変換できない他のタイプであることがあります。数値はOK:0はFALSEですが、それ以外は(ただしNA/NaNは)TRUEです。

  2. オブジェクトの長さは、正確に1(スカラー値)でなければなりません。 と長くなることがありますが、警告が表示されます。短くするとエラーになります。

例:

len3 <- 1:3 
if(len3) 'foo' # WARNING: the condition has length > 1 and only the first element will be used 

len0 <- numeric(0) 
if(len0) 'foo' # ERROR: argument is of length zero 

badVec1 <- NA 
if(badVec1) 'foo' # ERROR: missing value where TRUE/FALSE needed 

badVec2 <- 'Hello' 
if(badVec2) 'foo' # ERROR: argument is not interpretable as logical 
7

です:あなたは、

  1. あなた==NAためテストすることはできません必要is.na()
  2. 同様に、match()と友人の出力は、通常、NULLまたはのためにテストされます3210
  3. 私は} else {を1行に書く傾向があります。
+0

'match' *は常に*最初の引数( 'X')と同じ長さのベクトルを返します。この場合、常にスカラー値です。 – Tommy

+0

「The R Inferno」のサークル8.1.4 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –