简短的版本:使用formatC或sprintf。
更长的版本:
有几个函数可用于格式化数字,包括添加前导零。哪种格式最好取决于您想要执行的其他格式。
这个问题的例子很简单,因为所有的值一开始都有相同的位数,所以让我们尝试一个更难的例子,让10的幂的宽度也为8。
anim <- 25499:25504
x <- 10 ^ (0:5)
Paste(它的变体是paste0)通常是您遇到的第一个字符串操作函数。它们实际上并不是为操纵数字而设计的,但它们可以用于此。在简单的情况下,我们总是必须在前面加一个0,paste0是最好的解决方案。
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
对于数字中有可变位数的情况,您必须手动计算要前置多少个零,这已经够可怕的了,您只应该出于病态的好奇心这样做。
stringr中的Str_pad的工作原理类似于粘贴,这使得您想要填充的内容更加明确。
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
同样,它并不是为数字设计的,所以更困难的情况需要稍微考虑一下。我们应该只能说“pad with 0 to width 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"
stringi中的Stri_pad与stringr中的str_pad完全相同。
formatC是C函数printf的接口。使用它需要对底层函数的奥秘有所了解(见链接)。在这种情况下,重要的一点是width参数,格式为“d”表示“整数”,以及“0”标志表示前置零。
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是另一个格式化函数,主要用于创建手动轴标记标签。它对大范围的数字尤其有效。
缩放包有几个特殊格式类型的函数,比如percent、date_format和dollar。