Berurusan dengan faktor di R adalah pekerjaan yang cukup aneh, saya harus akui ... Saat menyusun ulang tingkat faktor, Anda tidak menyusun ulang nilai numerik yang mendasarinya. Berikut sedikit demonstrasi:
> 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"
Sekarang, jika Anda mengonversi faktor ini menjadi numerik, Anda akan mendapatkan:
# 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
Seperti yang Anda lihat ... dengan mengubah level, Anda hanya mengubah level (siapa yang tahu, eh?), Bukan nilai numerik! Tapi, ketika Anda menggunakan factorfungsi seperti yang disarankan @Jonathan Chang, sesuatu yang berbeda terjadi: Anda mengubah nilai numerik itu sendiri.
Anda mendapatkan kesalahan sekali lagi karena Anda melakukannya levelsdan kemudian mencoba melepaskannya dengan factor. Jangan lakukan itu !!! Jangan tidak menggunakan levelsatau Anda akan mengacaukan segalanya (kecuali Anda tahu persis apa yang Anda lakukan).
Satu saran kecil: hindari menamai objek Anda dengan nama yang identik dengan objek R ( dfadalah fungsi kepadatan untuk distribusi F, lettersberikan huruf alfabet huruf kecil). Dalam kasus khusus ini, kode Anda tidak akan salah, tetapi terkadang bisa ... tetapi ini dapat menimbulkan kebingungan, dan kami tidak menginginkannya, bukan?!? =)
Sebagai gantinya, gunakan sesuatu seperti ini (saya akan pergi dari awal sekali lagi):
> 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
Perhatikan bahwa Anda juga dapat menamai Anda data.framedengan dfdan letterssebagai pengganti g, dan hasilnya akan baik-baik saja. Sebenarnya kode ini identik dengan yang Anda posting, hanya namanya saja yang diubah. Bagian ini factor(dtf$letter, levels = letters[4:1])tidak akan menimbulkan kesalahan, tetapi bisa membingungkan!
Baca ?factormanualnya dengan seksama! Apa perbedaan antara factor(g, levels = letters[4:1])dan factor(g, labels = letters[4:1])? Apa yang mirip dalam levels(g) <- letters[4:1]dan g <- factor(g, labels = letters[4:1])?
Anda dapat menempatkan sintaks ggplot, jadi kami dapat membantu Anda lebih banyak tentang yang satu ini!
Bersulang!!!
Edit:
ggplot2sebenarnya perlu mengubah level dan nilai? Hm ... Aku akan menggali yang ini ...