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 }
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 }
NAは「わからない」という値なので、==で比較してもNAが返り、if()の条件には使えません。
直し方: y == 5 を !is.na(y) && y == 5 にします。
パターン3
1 z <- NA 2 if (z < 10 ) { ^ 3 print("small") 4 }
事前にis.na()でNAかどうかを確認してから比較する必要があります。
直し方: z < 10 を !is.na(z) && z < 10 にします。
パターン4
1 flag <- NA 2 if (flag ) { ^ 3 print("yes") 4 }
NA自体を直接if()の条件に渡しても、TRUEともFALSEとも判断できずエラーになります。
直し方: flag を !is.na(flag) && flag にします。
パターン5
1 v <- NA 2 if (v >= 0 ) { ^ 3 print("nonneg") 4 }
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にするのは、不正確な結論を出すよりは「分からないものは分からないままにする」という、統計的に誠実な設計判断です。