La versión corta: use formatC
o sprintf
.
La versión más larga:
Hay varias funciones disponibles para formatear números, incluida la adición de ceros a la izquierda. Cuál es el mejor depende de qué otro formato desea hacer.
El ejemplo de la pregunta es bastante fácil ya que todos los valores tienen el mismo número de dígitos para comenzar, así que intentemos un ejemplo más difícil de hacer potencias de 10 ancho 8 también.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(y su variante paste0
) son a menudo las primeras funciones de manipulación de cadenas que se encuentran. Realmente no están diseñados para manipular números, pero pueden usarse para eso. En el caso simple donde siempre tenemos que anteponer un solo cero, paste0
es la mejor solución.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Para el caso donde hay un número variable de dígitos en los números, debe calcular manualmente cuántos ceros anteponer, lo cual es lo suficientemente horrible como para hacerlo solo por curiosidad mórbida.
str_pad
from stringr
funciona de manera similar a paste
, lo que hace más explícito que desea rellenar las cosas.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Nuevamente, no está realmente diseñado para su uso con números, por lo que el caso más difícil requiere un poco de reflexión. Deberíamos poder decir "pad con ceros a ancho 8", pero mira esta salida:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Debe configurar la opción de penalización científica para que los números siempre estén formateados con notación fija (en lugar de notación científica).
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
en stringi
trabajos exactamente como str_pad
de stringr
.
formatC
es una interfaz a la función C printf
. Su uso requiere cierto conocimiento de los arcanos de esa función subyacente (ver enlace). En este caso, los puntos importantes son el width
argumento, que format
es "d"
para "entero" y a "0"
flag
para preceder ceros.
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 es mi solución favorita, ya que es fácil jugar con el cambio de ancho, y la función es lo suficientemente potente como para hacer otros cambios de formato.
sprintf
es una interfaz para la función C del mismo nombre; como formatC
pero con una sintaxis diferente.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
La principal ventaja de sprintf
es que puede incrustar números formateados dentro de fragmentos de texto más largos.
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."
Ver también la respuesta de Goodside .
Para completar, vale la pena mencionar las otras funciones de formato que ocasionalmente son útiles, pero que no tienen un método de anteponer ceros.
format
, una función genérica para formatear cualquier tipo de objeto, con un método para números. Funciona un poco como formatC
, pero con otra interfaz más.
prettyNum
es otra función de formato, principalmente para crear etiquetas de marca de eje manuales. Funciona particularmente bien para amplios rangos de números.
El scales
paquete tiene varias funciones como percent
, date_format
y dollar
para tipos de formatos especializados.
data$anim = paste(rep(0, n), data$anim, sep = "")