Saya memiliki bingkai data dengan beberapa variabel numerik dan beberapa factor
variabel kategori . Urutan level untuk faktor-faktor tersebut bukanlah seperti yang saya inginkan.
numbers <- 1:4
letters <- factor(c("a", "b", "c", "d"))
df <- data.frame(numbers, letters)
df
# numbers letters
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
Jika saya mengubah urutan level, huruf tidak lagi dengan nomor yang sesuai (data saya benar-benar tidak masuk akal mulai saat ini).
levels(df$letters) <- c("d", "c", "b", "a")
df
# numbers letters
# 1 1 d
# 2 2 c
# 3 3 b
# 4 4 a
Saya hanya ingin mengubah urutan level , jadi saat memplot, bilah ditampilkan dalam urutan yang diinginkan - yang mungkin berbeda dari urutan alfabet default.
Jawaban:
Gunakan
levels
argumenfactor
:sumber
beberapa lagi, hanya sebagai catatan
Anda juga dapat menemukan berguna Relevel dan combine_factor .
sumber
reorder(df$letters, seq(4,1))
Sejak pertanyaan ini terakhir aktif, Hadley telah merilis
forcats
paket barunya untuk memanipulasi faktor dan saya merasa sangat berguna. Contoh dari kerangka data OP:Untuk membalikkan level:
Untuk menambahkan lebih banyak level:
Dan masih banyak lagi
fct_xxx()
fungsi yang berguna .sumber
df %>% mutate(letters = fct_rev(letters))
.jadi apa yang Anda inginkan, dalam leksikon R, adalah mengubah hanya label untuk variabel faktor tertentu (yaitu, biarkan data serta level faktor tidak berubah).
mengingat bahwa Anda hanya ingin mengubah pemetaan titik-ke-label dan bukan data atau skema faktor (bagaimana titik data digabungkan ke dalam nampan individu atau nilai faktor, mungkin membantu untuk mengetahui bagaimana pemetaan awalnya ditetapkan saat Anda pertama kali membuat faktor.
aturannya sederhana:
sumber
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:
Sekarang, jika Anda mengonversi faktor ini menjadi numerik, Anda akan mendapatkan:
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 denganfactor
. Jangan lakukan itu !!! Jangan tidak menggunakanlevels
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):
Perhatikan bahwa Anda juga dapat menamai Anda
data.frame
dengandf
danletters
sebagai penggantig
, dan hasilnya akan baik-baik saja. Sebenarnya kode ini identik dengan yang Anda posting, hanya namanya saja yang diubah. Bagian inifactor(dtf$letter, levels = letters[4:1])
tidak akan menimbulkan kesalahan, tetapi bisa membingungkan!Baca
?factor
manualnya dengan seksama! Apa perbedaan antarafactor(g, levels = letters[4:1])
danfactor(g, labels = letters[4:1])
? Apa yang mirip dalamlevels(g) <- letters[4:1]
dang <- 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 ...sumber
Saya ingin menambahkan kasus lain di mana level dapat berupa string yang membawa angka bersama dengan beberapa karakter khusus: seperti contoh di bawah ini
Tingkat default
x
adalah:Di sini jika kita ingin menyusun ulang level faktor sesuai dengan nilai numerik, tanpa secara eksplisit menuliskan levelnya, yang bisa kita lakukan adalah
Semoga ini dapat menjadi informasi yang bermanfaat bagi pembaca selanjutnya.
sumber
Inilah fungsi saya untuk menyusun ulang faktor-faktor dari kerangka data yang diberikan:
Pemakaian:
reorderFactors(df, "my_col", desired_level_order = c("how","I","want"))
sumber