Salah satu hal yang digunakan untuk membingungkan saya sebagai yang baru ke R adalah bagaimana memformat angka sebagai persentase untuk dicetak.
Misalnya, tampilkan 0.12345
sebagai 12.345%
. Saya memiliki sejumlah solusi untuk ini, tetapi tidak satu pun dari ini tampaknya "baru oleh ramah". Sebagai contoh:
set.seed(1)
m <- runif(5)
paste(round(100*m, 2), "%", sep="")
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
sprintf("%1.2f%%", 100*m)
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
Pertanyaan: Apakah ada fungsi dasar R untuk melakukan ini? Atau, apakah ada paket yang digunakan secara luas yang menyediakan pembungkus yang nyaman?
Meskipun mencari sesuatu seperti ini ?format
, ?formatC
dan ?prettyNum
, saya belum menemukan pembungkus nyaman yang sesuai di basis R. ??"percent"
tidak menghasilkan sesuatu yang berguna. library(sos); findFn("format percent")
mengembalikan 1.250 hit - jadi sekali lagi tidak berguna. ggplot2
memiliki fungsi percent
tetapi ini tidak memberikan kontrol atas akurasi pembulatan.
sumber
sprintf
tampaknya menjadi solusi favorit di milis, dan saya belum melihat solusi yang lebih baik. Fungsi bawaan apa pun tidak akan lebih mudah untuk dipanggil, bukan?sprintf
baik-baik saja untuk subset dari coders R yang juga kebetulan programmer. Saya memiliki banyak kode dalam hidup saya, termasuk COBOL (gemetar) dan fortran (menunjukkan usia saya). Tapi saya tidak menganggapsprintf
aturan format jelas (terjemahan: WTF?). Dan tentu saja bungkus khusus harus lebih mudah dihubungi daripada sprintf, misalnya:format_percent(x=0.12345, digits=2)
sprintf()
hampir tidak memakan waktu banyak daripada mengetahui bahwa paket foo berisiformat_percent()
. Apa yang terjadi jika pengguna kemudian tidak ingin memformat sebagai persen tetapi sesuatu yang serupa? Mereka perlu menemukan pembungkus lain. Dalam jangka panjang, pembelajaran alat dasar akan bermanfaat.%
adalah karakter komentar di LaTeX, yang merupakan format pelaporan "default" untuk R. Jadi, sementara itu mungkin berguna untuk memberi label pada grafik, kehati-hatian harus diperhatikan jika nomor yang diformat akan di-Sweave.Jawaban:
Bahkan kemudian:
Seperti yang ditunjukkan oleh @DzimitryM,
percent()
telah "pensiun" yang mendukunglabel_percent()
, yang merupakan sinonim untukpercent_format()
fungsi lama .label_percent()
mengembalikan fungsi, jadi untuk menggunakannya, Anda membutuhkan sepasang tanda kurung tambahan.Kustomisasi ini dengan menambahkan argumen di dalam set kurung pertama.
Pembaruan, beberapa tahun kemudian:
Saat ini ada
percent
fungsi dalamscales
paket, seperti yang didokumentasikan dalam jawaban krlmlr. Gunakan itu alih-alih solusi linting tangan saya.Coba sesuatu seperti
Dengan penggunaan, misalnya,
(Jika Anda mau, ubah format dari
"f"
menjadi"g"
.)sumber
scales
ver. Manual 1.1.0 memberitahu:percent()
sudah pensiun; silakan gunakanlabel_percent()
sebagai gantinya, yang tidak cocok untuk pemformatan angka . Sehingga solusi linting masih relevanLihatlah
scales
paketnya. Dulu bagian dariggplot2
, saya pikir.Logika bawaan untuk mendeteksi presisi harus bekerja cukup baik untuk sebagian besar kasus.
sumber
percent(-0.1)
menghasilkanNaN%
scales::percent(c(-0.1, -0.2))
scales::percent(c(-0.1,-0.1,-0.1))
hasilkan"NaN%" "NaN%" "NaN%"
tetapi contoh Anda tidak bekerja. Untuk referensi orang lain, bug belum diperbaiki padascales_0.2.4
. Juga, pada hari ini, permintaan tarik yang terkait untuk memperbaikinya belum bergabung ke cabang utama.Lihat
percent
fungsi dariformattable
paket:sumber
scales::percent
dalam dua jawaban pertama tidak.Saya melakukan pembandingan untuk kecepatan pada jawaban-jawaban ini dan terkejut melihat
percent
dalamscales
paket yang disebut-sebut begitu, mengingat lambannya. Saya membayangkan keuntungannya adalah pendeteksi otomatis untuk pemformatan yang tepat, tetapi jika Anda tahu seperti apa data Anda, tampaknya jelas harus dihindari.Berikut adalah hasil dari mencoba memformat daftar 100.000 persentase dalam (0,1) menjadi persentase dalam 2 digit:
Jadi
sprintf
muncul sebagai pemenang yang jelas ketika kita ingin menambahkan tanda persen. Di sisi lain, jika kita hanya ingin mengalikan angka dan putaran (beralih dari proporsi menjadi persen tanpa "%", maka ituround()
adalah yang tercepat:sumber
Anda dapat menggunakan paket timbangan hanya untuk operasi ini (tanpa memuatnya dengan persyaratan atau pustaka)
sumber
Inilah solusi saya untuk mendefinisikan fungsi baru (sebagian besar agar saya bisa bermain-main dengan Curry and Compose :-)):
sumber
Melihat bagaimana
scalable::percent
telah terbukti paling lambat dan Liliana Pacheco menawarkan solusi lain, saya melanjutkan dan mencoba membandingkannya dengan beberapa opsi lain berdasarkan contoh yang ditetapkan Michael:Ini adalah hasil yang saya dapatkan:
Saya tidak tahu, mengapa
krlmlr()
danandrie1()
kinerja saya jauh lebih buruk daripada dalam contoh MichaelChirico. Ada petunjuk?sumber
sumber
Fungsi ini dapat mengubah data menjadi persentase menurut kolom
sumber
base2[, j] = base[ , j] * 100 / suma.c
. Juga patut dicatat bahwa ini bukan jawaban untuk pertanyaan ... pertanyaannya adalah tentang memformat sesuatu seperti0.5
"50.0%", bukan tentang melakukan perhitungan ...The
tidyverse
versi ini:Terlihat rapi seperti biasa.
sumber