Rでの因子の扱いは非常に奇妙な仕事です。私は認めなければなりません...因子レベルを並べ替えている間、基礎となる数値を並べ替えているわけではありません。ここに小さなデモがあります:
> numbers = 1:4
> letters = factor(letters[1:4])
> dtf <- data.frame(numbers, letters)
> dtf
  numbers letters
1       1       a
2       2       b
3       3       c
4       4       d
> sapply(dtf, class)
  numbers   letters 
"integer"  "factor" 
この係数を数値に変換すると、次のようになります。
# return underlying numerical values
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
# change levels
1> levels(dtf$letters) <- letters[4:1]
1> dtf
  numbers letters
1       1       d
2       2       c
3       3       b
4       4       a
# return numerical values once again
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
ご覧のとおり...レベルを変更すると、数値だけではなく、レベルのみが変更されます(だれが言うでしょう?)。しかし、factor@ Jonathan Changが提案したように関数を使用すると、別のことが起こります。数値自体を変更します。
もう一度エラーが発生するのは、エラーが発生した後、でレベルを再設定levelsしようとしたためですfactor。やめて!使用しないでください。そうしないと、levels物事が台無しになります(あなたが正確に何をしているかを理解している場合を除きます)。
ちょっとした提案:Rのオブジェクトと同じ名前でオブジェクトに名前を付けないようにします(dfF分布の密度関数であり、letters小文字のアルファベットを与えます)。この特定のケースでは、コードに欠陥はありませんが、時にはエラーになる可能性があります...しかし、これにより混乱が生じる可能性があります。=)
代わりに、次のようなものを使用します(もう一度最初からやります)。
> dtf <- data.frame(f = 1:4, g = factor(letters[1:4]))
> dtf
  f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 1 2 3 4
> dtf$g <- factor(dtf$g, levels = letters[4:1])
> dtf
  f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 4 3 2 1
あなたもあなたの名前を付けることに注意してくださいdata.frameとdfし、letters代わりにg、その結果はOKになります。実際、このコードは投稿したコードと同じで、名前だけが変更されています。この部分factor(dtf$letter, levels = letters[4:1])はエラーをスローしませんが、混乱する可能性があります!
?factorマニュアルをよくお読みください!違いは何だfactor(g, levels = letters[4:1])とはfactor(g, labels = letters[4:1])?何で同様だlevels(g) <- letters[4:1]とg <- factor(g, labels = letters[4:1])?
あなたはggplot構文を置くことができますので、これについてもっとあなたを助けることができます!
乾杯!!!
編集:
ggplot2レベルと値の両方を実際に変更する必要がありますか?うーん...これを掘り出します...