简而言之:使用 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")
再次强调,它并不是专门设计用于数字,因此更难的情况需要一点思考。我们本应该只需要说“在宽度为8的情况下补零”,但看看这个输出结果:
str_pad(x, 8, pad = "0")
您需要设置科学惩罚选项,以便数字始终使用固定表示法(而不是科学表示法)进行格式化。
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
stri_pad
在stringi
中的作用与stringr
中的str_pad
完全相同。
formatC
是一个与 C 函数 printf
相关的接口。使用它需要一些了解底层函数的奥秘(请参见链接)。在这种情况下,重要的点是 width
参数,format
为 "d"
表示整数,以及用于前置零的 "0"
标志。
formatC(anim, width = 6, format = "d", flag = "0")
formatC(x, width = 8, format = "d", flag = "0")
这是我最喜欢的解决方案,因为它易于调整宽度,并且该功能足够强大以进行其他格式更改。
sprintf
是与同名C函数对应的接口;类似于formatC
,但语法不同。
sprintf("%06d", anim)
sprintf("%08d", x)
< p >
sprintf
的主要优点是您可以将格式化的数字嵌入到较长的文本中。< /p >
sprintf(
"Animal ID %06d was a %s.",
anim,
sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
另请参见goodside的答案。
为了完整起见,值得一提的是其他格式化函数,它们偶尔很有用,但没有添加前导零的方法。
format
是一个通用的格式化任何类型对象的函数,其中包括数字的方法。 它的工作方式有点像 formatC
,但具有另一种接口。
prettyNum
是另一个格式化函数,主要用于创建手动轴刻度标签。 它在大范围的数字上特别有效。
scales
包含几个函数,例如 percent
, date_format
和 dollar
用于专业格式类型。
data$anim = paste(rep(0, n), data$anim, sep = "")
。 - Ramnath