Phiên bản ngắn: sử dụng formatC
hoặc sprintf
.
Phiên bản dài hơn:
Có một số hàm có sẵn để định dạng số, bao gồm thêm các số 0 đứng đầu. Cái nào là tốt nhất phụ thuộc vào định dạng khác mà bạn muốn làm.
Ví dụ từ câu hỏi khá dễ vì tất cả các giá trị có cùng số chữ số để bắt đầu, vì vậy, hãy thử một ví dụ khó hơn về việc tạo ra các lũy thừa 10 chiều rộng 8.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(và đó là biến thể paste0
) thường là các hàm thao tác chuỗi đầu tiên mà bạn gặp. Chúng không thực sự được thiết kế để thao túng các con số, nhưng chúng có thể được sử dụng cho điều đó. Trong trường hợp đơn giản, chúng ta luôn phải trả trước một số 0 duy nhất, paste0
là giải pháp tốt nhất.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Đối với trường hợp có một số chữ số khác nhau trong các số, bạn phải tính toán thủ công có bao nhiêu số 0, điều này đủ khủng khiếp đến mức bạn chỉ nên làm điều đó vì tò mò bệnh hoạn.
str_pad
từ stringr
hoạt động tương tự như paste
, làm cho rõ ràng hơn rằng bạn muốn đệm mọi thứ.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Một lần nữa, nó không thực sự được thiết kế để sử dụng với các con số, vì vậy trường hợp khó hơn đòi hỏi một chút suy nghĩ. Chúng ta chỉ nên nói "pad có số 0 đến chiều rộng 8", nhưng hãy nhìn vào đầu ra này:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Bạn cần đặt tùy chọn hình phạt khoa học để các số luôn được định dạng bằng cách sử dụng ký hiệu cố định (thay vì ký hiệu khoa học).
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
trong stringi
các công trình chính xác như str_pad
từ stringr
.
formatC
là một giao diện đến chức năng C printf
. Sử dụng nó đòi hỏi một số kiến thức về arcana của chức năng cơ bản đó (xem liên kết). Trong trường hợp này, các điểm quan trọng là width
đối số, format
là "d"
"số nguyên" và là một "0"
flag
số 0 chuẩn bị.
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"
Đây là giải pháp yêu thích của tôi, vì nó dễ dàng thay đổi độ rộng và chức năng đủ mạnh để thực hiện các thay đổi định dạng khác.
sprintf
là một giao diện cho chức năng C cùng tên; thích formatC
nhưng với một cú pháp khác nhau.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
Ưu điểm chính sprintf
là bạn có thể nhúng các số được định dạng bên trong các đoạn văn bản dài hơn.
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."
Xem thêm câu trả lời của hàng hóa .
Để hoàn thiện, điều đáng nói là các hàm định dạng khác đôi khi hữu ích, nhưng không có phương pháp chuẩn bị số 0.
format
, một hàm chung để định dạng bất kỳ loại đối tượng nào, với một phương thức cho các số. Nó hoạt động một chút như thế formatC
, nhưng với một giao diện khác.
prettyNum
là một chức năng định dạng khác, chủ yếu để tạo nhãn đánh dấu trục thủ công. Nó hoạt động đặc biệt tốt cho phạm vi rộng của số.
Các scales
gói có một số chức năng như percent
, date_format
và dollar
với nhiều loại định dạng chuyên khoa.
data$anim = paste(rep(0, n), data$anim, sep = "")