รุ่นสั้น: การใช้งานหรือformatC
sprintf
รุ่นที่ยาวกว่า:
มีหลายฟังก์ชั่นสำหรับจัดรูปแบบตัวเลขรวมถึงการเพิ่มเลขศูนย์นำหน้า รูปแบบใดดีที่สุดขึ้นอยู่กับการจัดรูปแบบอื่นที่คุณต้องการทำ
ตัวอย่างจากคำถามนั้นค่อนข้างง่ายเนื่องจากค่าทั้งหมดมีจำนวนหลักเท่ากันเริ่มต้นดังนั้นลองทำตัวอย่างที่ยากขึ้นในการสร้างพลังของความกว้าง 10 8
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(และเป็นตัวแปรpaste0
) มักจะเป็นฟังก์ชั่นการจัดการสตริงตัวแรกที่คุณเจอ พวกมันไม่ได้ออกแบบมาเพื่อจัดการกับตัวเลข แต่สามารถใช้กับมันได้ ในกรณีง่าย ๆ ที่เราจะต้องเติมศูนย์เดียวเสมอpaste0
เป็นทางออกที่ดีที่สุด
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
สำหรับกรณีที่มีตัวเลขจำนวนตัวแปรในตัวเลขคุณจะต้องคำนวณจำนวนศูนย์ที่จะเติมด้วยตนเองด้วยตนเองซึ่งน่ากลัวพอที่คุณควรทำด้วยความอยากรู้อยากเห็น
str_pad
จากstringr
งานที่คล้ายกันpaste
ทำให้ชัดเจนยิ่งขึ้นว่าคุณต้องการรองสิ่งต่าง ๆ
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
อีกครั้งมันไม่ได้ออกแบบมาเพื่อใช้กับตัวเลขดังนั้นกรณีที่ยากกว่านั้นต้องใช้ความคิดเล็กน้อย เราควรจะสามารถพูดว่า "แผ่นที่มีเลขศูนย์ถึงความกว้าง 8" แต่ดูที่ผลลัพธ์นี้:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
คุณต้องตั้งค่าตัวเลือกการลงโทษทางวิทยาศาสตร์เพื่อให้ตัวเลขถูกจัดรูปแบบโดยใช้เครื่องหมายถาวร (แทนที่จะเป็นเครื่องหมายทางวิทยาศาสตร์)
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
ในstringi
การทำงานเหมือนกันจากstr_pad
stringr
formatC
printf
เป็นอินเตอร์เฟซฟังก์ชั่นซี การใช้มันต้องการความรู้เกี่ยวกับอาร์คานาของฟังก์ชั่นพื้นฐานนั้น (ดูลิงค์) ในกรณีนี้ประเด็นสำคัญคือการwidth
โต้แย้งformat
เป็น"d"
สำหรับ "จำนวนเต็ม" และ"0"
flag
สำหรับการเติมศูนย์
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"
นี่เป็นทางออกที่ฉันโปรดปรานเนื่องจากง่ายต่อการเปลี่ยนความกว้างและฟังก์ชั่นนี้มีประสิทธิภาพเพียงพอที่จะเปลี่ยนแปลงการจัดรูปแบบอื่น ๆ
sprintf
เป็นส่วนต่อประสานกับฟังก์ชั่น C ในชื่อเดียวกัน ชอบformatC
แต่มีไวยากรณ์แตกต่างกัน
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
ข้อได้เปรียบหลักของsprintf
คือคุณสามารถฝังตัวเลขที่จัดรูปแบบไว้ในข้อความที่ยาวขึ้นได้
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."
ดูเพิ่มเติมคำตอบ goodside ของ
เพื่อความสมบูรณ์เป็นสิ่งที่ควรค่าแก่การกล่าวถึงฟังก์ชั่นการจัดรูปแบบอื่น ๆ ซึ่งบางครั้งก็มีประโยชน์ แต่ไม่มีวิธีเตรียมเลขศูนย์
format
ฟังก์ชั่นทั่วไปสำหรับการจัดรูปแบบวัตถุชนิดใด ๆ ด้วยวิธีการตัวเลข มันใช้งานได้เล็กน้อยเหมือนformatC
กัน แต่มีอีกอินเตอร์เฟสหนึ่ง
prettyNum
ยังเป็นอีกหนึ่งฟังก์ชั่นการจัดรูปแบบซึ่งส่วนใหญ่ใช้สำหรับสร้างฉลากติ๊กแกนเอง มันทำงานได้ดีโดยเฉพาะสำหรับช่วงกว้างของตัวเลข
scales
แพคเกจมีหน้าที่หลายอย่างเช่นpercent
, date_format
และdollar
ประเภทรูปแบบผู้เชี่ยวชาญ
data$anim = paste(rep(0, n), data$anim, sep = "")