Versi singkat: gunakan formatC
atau sprintf
.
Versi yang lebih panjang:
Ada beberapa fungsi yang tersedia untuk memformat angka, termasuk menambahkan angka nol di depan. Yang mana yang terbaik tergantung pada format apa yang ingin Anda lakukan.
Contoh dari pertanyaan ini cukup mudah karena semua nilai memiliki jumlah digit yang sama untuk memulai, jadi mari kita coba contoh yang lebih sulit untuk membuat kekuatan 10 lebar 8 juga.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(dan variannya paste0
) seringkali merupakan fungsi manipulasi string pertama yang Anda temui. Mereka tidak benar-benar dirancang untuk memanipulasi angka, tetapi mereka dapat digunakan untuk itu. Dalam kasus sederhana di mana kita selalu harus menambahkan satu nol, paste0
adalah solusi terbaik.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Untuk kasus di mana ada jumlah variabel angka dalam angka, Anda harus menghitung secara manual berapa banyak nol untuk ditambahkan, yang cukup mengerikan sehingga Anda hanya harus melakukannya karena penasaran yang tidak wajar.
str_pad
dari stringr
karya yang mirip dengan paste
, membuatnya lebih eksplisit bahwa Anda ingin memberi pad hal.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Sekali lagi, itu tidak benar-benar dirancang untuk digunakan dengan angka, sehingga kasus yang lebih sulit memerlukan sedikit pemikiran. Kita hanya bisa mengatakan "pad dengan nol ke lebar 8", tetapi lihat output ini:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Anda perlu mengatur opsi penalti ilmiah sehingga angka selalu diformat menggunakan notasi tetap (bukan notasi ilmiah).
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
dalam stringi
karya persis seperti str_pad
dari stringr
.
formatC
adalah sebuah antarmuka untuk fungsi C printf
. Menggunakannya membutuhkan beberapa pengetahuan tentang arcana dari fungsi yang mendasarinya (lihat tautan). Dalam hal ini, poin penting adalah width
argumen, format
yang "d"
untuk "integer", dan "0"
flag
untuk mengawali nol.
formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
Ini adalah solusi favorit saya, karena mudah untuk bermain-main dengan mengubah lebar, dan fungsinya cukup kuat untuk membuat perubahan format lainnya.
sprintf
adalah antarmuka ke fungsi C dengan nama yang sama; suka formatC
tetapi dengan sintaks yang berbeda.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
Keuntungan utama sprintf
adalah Anda dapat menyematkan angka yang diformat ke dalam bit teks yang lebih panjang.
sprintf(
"Animal ID %06d was a %s.",
anim,
sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger."
## [3] "Animal ID 025501 was a lion." "Animal ID 025502 was a tiger."
## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion."
Lihat juga jawaban goodside .
Untuk kelengkapannya, perlu disebutkan fungsi pemformatan lain yang kadang-kadang berguna, tetapi tidak memiliki metode untuk menambahkan nol.
format
, fungsi generik untuk memformat objek apa pun, dengan metode untuk angka. Ini bekerja sedikit seperti formatC
, tetapi dengan antarmuka yang lain.
prettyNum
adalah fungsi pemformatan lain, sebagian besar untuk membuat label centang sumbu manual. Ini bekerja sangat baik untuk rentang angka yang luas.
The scales
paket memiliki beberapa fungsi seperti percent
, date_format
dan dollar
untuk jenis format yang spesialis.
data$anim = paste(rep(0, n), data$anim, sep = "")