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のオブジェクトと同じ名前でオブジェクトに名前を付けないようにします(df
F分布の密度関数であり、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
レベルと値の両方を実際に変更する必要がありますか?うーん...これを掘り出します...