Code Fix

中級

順序なし 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")
出力: NA

順序なしfactorに<を使うと比較自体が成立せずNAと警告になります。ordered = TRUEにすると水準の順序に沿った比較ができます。

直し方: (空) を , ordered = TRUE にします。

この問題を解いてみる →

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

パターン2

 1  size <- factor("M", levels = c("S", "M", "L")                )
                                                         ^
 2  result <- size > "S"
 3  cat(result, "\n")
出力: NA

sizeが順序なしfactorのままだと大小比較ができずNAになります。水準に順序を持たせる必要があります。

直し方: (空) を , ordered = TRUE にします。

この問題を解いてみる →

パターン3

 1  level <- factor("mid", levels = c("low", "mid", "high")                )
                                                                   ^
 2  result <- level < "high"
 3  cat(result, "\n")
出力: NA

levelを比較に使うつもりなら、factor作成時にordered = TRUEを指定しておく必要があります。

直し方: (空) を , ordered = TRUE にします。

この問題を解いてみる →

パターン4

 1  rank <- factor("gold", levels = c("bronze", "silver", "gold")                )
                                                                         ^
 2  result <- rank > "silver"
 3  cat(result, "\n")
出力: NA

「'>' 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")
出力: NA

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に伝わり、<や>による比較が機能するようになります。

演習をはじめる

関連するエラー

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