A versão curta: use formatC
ou sprintf
.
A versão mais longa:
Existem várias funções disponíveis para formatar números, incluindo a adição de zeros à esquerda. Qual é o melhor depende de qual outra formatação você deseja fazer.
O exemplo da pergunta é bastante fácil, já que todos os valores têm o mesmo número de dígitos, portanto, vamos tentar um exemplo mais difícil de criar potências de 10 de largura 8 também.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(e sua variante paste0
) geralmente são as primeiras funções de manipulação de strings que você encontra. Eles não são realmente projetados para manipular números, mas podem ser usados para isso. No caso simples, em que sempre precisamos acrescentar um único zero, paste0
é a melhor solução.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
No caso em que há um número variável de dígitos nos números, é necessário calcular manualmente quantos zeros devem ser acrescentados, o que é horrível o suficiente para que você deva fazê-lo apenas por curiosidade mórbida.
str_pad
de stringr
obras de forma semelhante a paste
, tornando-a mais explícita que você quer coisas almofada.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Novamente, ele não foi realmente projetado para uso com números, portanto, o caso mais difícil exige um pouco de reflexão. Deveríamos apenas poder dizer "almofada com zeros na largura 8", mas veja esta saída:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Você precisa definir a opção de penalidade científica para que os números sejam sempre formatados usando notação fixa (em vez de notação científica).
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
em stringi
obras exatamente como str_pad
de stringr
.
formatC
é uma interface para a função C printf
. Usá-lo requer algum conhecimento dos arcanos dessa função subjacente (consulte o link). Nesse caso, os pontos importantes são o width
argumento, format
sendo "d"
para "número inteiro" e um "0"
flag
para preceder zeros.
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"
Esta é a minha solução favorita, pois é fácil mexer na alteração da largura e a função é poderosa o suficiente para fazer outras alterações na formatação.
sprintf
é uma interface para a função C com o mesmo nome; como formatC
, mas com uma sintaxe diferente.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
A principal vantagem sprintf
é que você pode incorporar números formatados em bits de texto mais longos.
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."
Veja também a resposta da mercadoria .
Para completar, vale a pena mencionar as outras funções de formatação que são úteis ocasionalmente, mas não têm método de preceder zeros.
format
, uma função genérica para formatar qualquer tipo de objeto, com um método para números. Funciona um pouco como formatC
, mas com outra interface.
prettyNum
é mais uma função de formatação, principalmente para a criação de rótulos de marcação de eixo manuais. Funciona particularmente bem para amplas faixas de números.
O scales
pacote possui várias funções, como percent
, date_format
e dollar
para tipos de formato especializados.
data$anim = paste(rep(0, n), data$anim, sep = "")