简短版本:使用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
from的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
是C函数的接口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 = "")