La version courte: utilisez formatC
ou sprintf
.
La version plus longue:
Plusieurs fonctions sont disponibles pour formater les nombres, notamment l'ajout de zéros non significatifs. Le meilleur choix dépend du formatage que vous souhaitez effectuer.
L'exemple de la question est assez facile car toutes les valeurs ont le même nombre de chiffres pour commencer, alors essayons un exemple plus difficile de faire des puissances de 10 largeur 8 aussi.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(et sa variante paste0
) sont souvent les premières fonctions de manipulation de chaînes que vous rencontrez. Ils ne sont pas vraiment conçus pour manipuler des nombres, mais ils peuvent être utilisés pour cela. Dans le cas simple où nous devons toujours ajouter un seul zéro, paste0
c'est la meilleure solution.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Dans le cas où il y a un nombre variable de chiffres dans les nombres, vous devez calculer manuellement le nombre de zéros à ajouter, ce qui est suffisamment horrible pour que vous ne le fassiez que par curiosité morbide.
str_pad
à partir de stringr
travaux similaires à paste
, ce qui rend plus explicite le fait que vous souhaitez remplir les choses.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Encore une fois, il n'est pas vraiment conçu pour être utilisé avec des chiffres, donc le cas le plus difficile nécessite un peu de réflexion. On devrait juste pouvoir dire "pad avec des zéros de largeur 8", mais regardez cette sortie:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Vous devez définir l' option de pénalité scientifique afin que les nombres soient toujours formatés en utilisant une notation fixe (plutôt que la notation scientifique).
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
dans des stringi
œuvres exactement comme à str_pad
partir de stringr
.
formatC
est une interface pour la fonction C printf
. Son utilisation nécessite une certaine connaissance des arcanes de cette fonction sous-jacente (voir lien). Dans ce cas, les points importants sont l' width
argument, format
étant "d"
pour "entier", et un "0"
flag
pour les zéros au début.
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"
C'est ma solution préférée, car il est facile de bricoler en changeant la largeur et la fonction est suffisamment puissante pour effectuer d'autres changements de mise en forme.
sprintf
est une interface vers la fonction C du même nom; commeformatC
mais avec une syntaxe différente.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
Le principal avantage de sprintf
est que vous pouvez intégrer des nombres formatés dans des morceaux de texte plus longs.
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."
Voir également la réponse de goodside .
Par souci d'exhaustivité, il convient de mentionner les autres fonctions de formatage qui sont parfois utiles, mais n'ont pas de méthode pour ajouter des zéros.
format
, une fonction générique pour formater tout type d'objet, avec une méthode pour les nombres. Cela fonctionne un peu comme formatC
, mais avec encore une autre interface.
prettyNum
est encore une autre fonction de formatage, principalement pour créer des étiquettes de tick d'axe manuel. Il fonctionne particulièrement bien pour de larges plages de nombres.
Le scales
paquet a plusieurs fonctions telles que percent
, date_format
et dollar
pour les types de format spécialisés.
data$anim = paste(rep(0, n), data$anim, sep = "")