Code Fix

初級

if (NA > 1) が missing value where TRUE/FALSE needed になる理由

NAを含む式をif()の条件に使うと、真偽が定まらないため「missing value where TRUE/FALSE needed」というエラーで止まります。

エラーメッセージの読み方

Error in if (x > 1) { : missing value where TRUE/FALSE needed
Error
エラー種別 — 実行中に発生しました
if (x > 1) {
発生箇所 — エラーの原因になった呼び出し
missing value where TRUE/FALSE needed
詳細メッセージ — 何が問題だったか

このエラーが出る典型パターン

パターン1

 1  x <- NA
 2  if (x > 1             ) {
                 ^
 3    print("big")
 4  }
Error in if (x > 1) { : missing value where TRUE/FALSE needed

NAを含む比較の結果はTRUEでもFALSEでもなくNAです。if()はNAを真偽として判断できずエラーになります。

直し方: x > 1 を !is.na(x) && x > 1 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  y <- NA
 2  if (y == 5             ) {
                 ^
 3    print("five")
 4  }
Error in if (y == 5) { : missing value where TRUE/FALSE needed

NAは「わからない」という値なので、==で比較してもNAが返り、if()の条件には使えません。

直し方: y == 5 を !is.na(y) && y == 5 にします。

この問題を解いてみる →

パターン3

 1  z <- NA
 2  if (z < 10             ) {
                 ^
 3    print("small")
 4  }
Error in if (z < 10) { : missing value where TRUE/FALSE needed

事前にis.na()でNAかどうかを確認してから比較する必要があります。

直し方: z < 10 を !is.na(z) && z < 10 にします。

この問題を解いてみる →

パターン4

 1  flag <- NA
 2  if (flag                ) {
                  ^
 3    print("yes")
 4  }
Error in if (flag) { : missing value where TRUE/FALSE needed

NA自体を直接if()の条件に渡しても、TRUEともFALSEとも判断できずエラーになります。

直し方: flag を !is.na(flag) && flag にします。

この問題を解いてみる →

パターン5

 1  v <- NA
 2  if (v >= 0             ) {
                 ^
 3    print("nonneg")
 4  }
Error in if (v >= 0) { : missing value where TRUE/FALSE needed

NAは自動的にFALSE扱いされるわけではなく、is.na()による明示的な確認が必要です。

直し方: v >= 0 を !is.na(v) && v >= 0 にします。

この問題を解いてみる →

よくある誤解

「NAは自動的にFALSE扱いされるはず」という思い込みは誤りです。NAは「わからない」という値であり、if()はTRUEともFALSEとも判断できずエラーになります。事前にis.na()で確認する必要があります。

実務での勘所

この挙動は統計解析言語としてのRの成り立ちに深く根ざしています。NAは単なる「空の値」ではなく「欠測データ(本当は何らかの値があるはずだが分からない)」を表します。統計的に正直に考えれば、「分からない値は1より大きいか」という問いに対する答えも「分からない」以外にありえません。FALSEを返してしまうと、まるで「1より大きくないと確認できた」かのような誤った情報を伝えてしまいます。RがNAとの比較結果を一貫してNAにするのは、不正確な結論を出すよりは「分からないものは分からないままにする」という、統計的に誠実な設計判断です。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)