La versione breve: usa formatC
o sprintf
.
La versione più lunga:
Sono disponibili diverse funzioni per la formattazione dei numeri, inclusa l'aggiunta di zeri iniziali. Qual è il migliore dipende da quale altra formattazione vuoi fare.
L'esempio della domanda è abbastanza semplice poiché tutti i valori hanno lo stesso numero di cifre per cominciare, quindi proviamo un esempio più duro di fare anche poteri di 10 larghezza 8.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(e la sua variante paste0
) sono spesso le prime funzioni di manipolazione delle stringhe che incontri. Non sono progettati per manipolare i numeri, ma possono essere usati per quello. Nel semplice caso in cui dobbiamo sempre anteporre un singolo zero, paste0
è la soluzione migliore.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Nel caso in cui ci sia un numero variabile di cifre nei numeri, devi calcolare manualmente quanti zeri da anteporre, il che è abbastanza orribile che dovresti farlo solo per morbosa curiosità.
str_pad
da stringr
funziona in modo simile a paste
, rendendo più esplicito che si desidera riempire le cose.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Ancora una volta, non è davvero progettato per l'uso con i numeri, quindi il caso più difficile richiede un piccolo pensiero. Dovremmo essere in grado di dire "pad con zero da 8", ma guarda questo output:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Devi impostare l' opzione penalità scientifica in modo che i numeri siano sempre formattati usando la notazione fissa (piuttosto che la notazione scientifica).
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
in stringi
funziona esattamente come str_pad
da stringr
.
formatC
è un'interfaccia alla funzione C printf
. Il suo utilizzo richiede una certa conoscenza degli arcani di quella funzione sottostante (vedi link). In questo caso, i punti importanti sono l' width
argomento, format
essendo "d"
"integer" e a "0"
flag
per anteporre zero.
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"
Questa è la mia soluzione preferita, poiché è facile armeggiare cambiando la larghezza e la funzione è abbastanza potente da apportare altre modifiche alla formattazione.
sprintf
è un'interfaccia per la funzione C con lo stesso nome; come formatC
ma con una sintassi diversa.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
Il vantaggio principale di sprintf
è che puoi incorporare numeri formattati all'interno di bit di testo più lunghi.
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."
Vedi anche la risposta di Goodside .
Per completezza vale la pena menzionare le altre funzioni di formattazione che sono occasionalmente utili, ma non hanno un metodo per anteporre zero.
format
, una funzione generica per la formattazione di qualsiasi tipo di oggetto, con un metodo per i numeri. Funziona un po 'come formatC
, ma con l'ennesima interfaccia.
prettyNum
è ancora un'altra funzione di formattazione, principalmente per la creazione di etichette di tick dell'asse manuale. Funziona particolarmente bene per ampie gamme di numeri.
Il scales
pacchetto ha diverse funzioni come percent
, date_format
e dollar
per tipi di formati speciali.
data$anim = paste(rep(0, n), data$anim, sep = "")