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 factor
fungsi seperti yang disarankan @Jonathan Chang, sesuatu yang berbeda terjadi: Anda mengubah nilai numerik itu sendiri.
Anda mendapatkan kesalahan sekali lagi karena Anda melakukannya levels
dan kemudian mencoba melepaskannya dengan factor
. Jangan lakukan itu !!! Jangan tidak menggunakan levels
atau 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 ( df
adalah fungsi kepadatan untuk distribusi F, letters
berikan 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.frame
dengan df
dan letters
sebagai 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 ?factor
manualnya 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:
ggplot2
sebenarnya perlu mengubah level dan nilai? Hm ... Aku akan menggali yang ini ...