順序なし factor を < や > で比較すると警告付きで NA になる
factor型の値は、順序を持たない通常のfactorのままだと< や >のような大小比較ができず、'not meaningful for factors'という警告とともにNAになります。大小関係のある比較をしたい場合は、factor()の時点でordered = TRUEを指定しておく必要があります。
なぜエラーが出ないのか
出力: NA
(エラーなし)- Rは何も報告しません。文法としても実行としても正しいコードだからです
NA- 実際の出力 — 期待した結果と食い違っている箇所
このエラーが出る典型パターン
パターン1
1 grade <- factor("B", levels = c("A", "B", "C") ) ^ 2 result <- grade < "C" 3 cat(result, "\n")
順序なしfactorに<を使うと比較自体が成立せずNAと警告になります。ordered = TRUEにすると水準の順序に沿った比較ができます。
直し方: (空) を , ordered = TRUE にします。
パターン2
1 size <- factor("M", levels = c("S", "M", "L") ) ^ 2 result <- size > "S" 3 cat(result, "\n")
sizeが順序なしfactorのままだと大小比較ができずNAになります。水準に順序を持たせる必要があります。
直し方: (空) を , ordered = TRUE にします。
パターン3
1 level <- factor("mid", levels = c("low", "mid", "high") ) ^ 2 result <- level < "high" 3 cat(result, "\n")
levelを比較に使うつもりなら、factor作成時にordered = TRUEを指定しておく必要があります。
直し方: (空) を , ordered = TRUE にします。
パターン4
1 rank <- factor("gold", levels = c("bronze", "silver", "gold") ) ^ 2 result <- rank > "silver" 3 cat(result, "\n")
「'>' not meaningful for factors」という警告とともにNAが返るのは、rankが順序を持たないfactorだからです。
直し方: (空) を , ordered = TRUE にします。
パターン5
1 tier <- factor("basic", levels = c("basic", "plus", "pro") ) ^ 2 result <- tier < "pro" 3 cat(result, "\n")
factorはそのままでは大小関係を持たないため、ordered = TRUEを付けて初めて<や>が意味を持ちます。
直し方: (空) を , ordered = TRUE にします。
よくある誤解
「文字列として値が並んでいるなら、大小もその見た目通りに比較できるはず」という思い込みは誤りです。factorは水準(levels)に割り当てられた整数として保持されているだけで、順序を持つかどうかはordered属性で別途決まります。ordered = TRUEを指定しない限り、<や>による比較は成立せずNAになります。
実務での勘所
factor()は水準の順序を指定しない限り、アルファベット順で整数コードを割り振ります。"Low"、"Medium"、"High"という値からfactorを作ると、水準は"High"、"Low"、"Medium"の順(アルファベット順)に並び、内部的な整数コードもHigh=1、Low=2、Medium=3のように、意図した「低い→高い」という大小関係とはまったく無関係な順序で割り当てられます。ordered = TRUEを指定して初めて、水準の並び順そのものが「意味のある順序」だとRに伝わり、<や>による比較が機能するようになります。