Versi singkat: gunakan formatCatau 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, paste0adalah 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_paddari stringrkarya 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_paddalam stringikarya persis seperti str_paddari stringr.
formatCadalah sebuah antarmuka untuk fungsi C printf. Menggunakannya membutuhkan beberapa pengetahuan tentang arcana dari fungsi yang mendasarinya (lihat tautan). Dalam hal ini, poin penting adalah widthargumen, formatyang "d"untuk "integer", dan "0" flaguntuk 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.
sprintfadalah antarmuka ke fungsi C dengan nama yang sama; suka formatCtetapi 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 sprintfadalah 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.
prettyNumadalah fungsi pemformatan lain, sebagian besar untuk membuat label centang sumbu manual. Ini bekerja sangat baik untuk rentang angka yang luas.
The scalespaket memiliki beberapa fungsi seperti percent, date_formatdan dollaruntuk jenis format yang spesialis.
data$anim = paste(rep(0, n), data$anim, sep = "")