R'deki faktörlerle uğraşmak oldukça tuhaf bir iş, itiraf etmeliyim ... Faktör seviyelerini yeniden sıralarken, altta yatan sayısal değerleri yeniden düzenlemiyorsunuz. İşte küçük bir gösteri:
> 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"
Şimdi, bu faktörü sayısal değere dönüştürürseniz, şunu elde edersiniz:
# 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
Gördüğünüz gibi ... seviyeleri değiştirerek, sayısal değerleri değil, yalnızca seviyeleri (kim söyler ki, eh?) Değiştirirsiniz! Ancak, factor
@Jonathan Chang'ın önerdiği işlevi kullandığınızda , farklı bir şey olur: sayısal değerleri kendiniz değiştirirsiniz.
Bir kez daha hata alıyorsun çünkü yapıyorsun levels
ve sonra onu yeniden seviyelendirmeye çalışıyorsun factor
. Yapma !!! Do not kullanmak levels
veya işleri berbat olacak (ne yaptığınızı tam olarak bilmek sürece).
Bir lil 'öneri: nesnelerinizi R'nin nesneleri ile aynı isimle adlandırmaktan kaçının ( df
F dağılımı için yoğunluk fonksiyonudur, letters
küçük harfli alfabe harfleri verir). Bu özel durumda, kodunuz hatalı olmayacaktır, ancak bazen olabilir ... ama bu kafa karışıklığı yaratabilir ve biz bunu istemiyoruz, değil mi?!? =)
Bunun yerine, şuna benzer bir şey kullanın (bir kez daha baştan başlayacağım):
> 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
Ayrıca sizi adlandırabilir geldiğini hatırlatırız data.frame
ile df
ve letters
yerine g
ve sonuç olumlu olacaktır. Aslında, bu kod gönderdiğiniz kodla aynıdır, sadece isimler değiştirilir. Bu kısımfactor(dtf$letter, levels = letters[4:1])
bir hata vermez, ancak kafa karıştırıcı olabilir!
?factor
Kılavuzu iyice okuyun ! Arasındaki fark nedir factor(g, levels = letters[4:1])
ve factor(g, labels = letters[4:1])
? Benzer ne var levels(g) <- letters[4:1]
ve g <- factor(g, labels = letters[4:1])
?
Ggplot sözdizimi koyabilirsiniz, böylece size bu konuda daha fazla yardımcı olabiliriz!
Alkış !!!
Düzenle:
ggplot2
aslında hem seviyeleri hem de değerleri değiştirmeyi gerektiriyor mu? Hm ... Bunu çıkaracağım ...