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
と、物事が台無しになります(自分が何をしているかを正確に理解していない限り)。
1つのlilの提案: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
して名前を付けることもでき、結果はOKになることに注意してください。実際、このコードはあなたが投稿したものと同じですが、名前だけが変更されています。この部分はエラーをスローしませんが、混乱する可能性があります。df
letters
g
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
実際にレベルと値の両方を変更する必要がありますか?うーん...これを掘り出します...