La versione breve: usa formatCo 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_padda stringrfunziona 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_padin stringifunziona esattamente come str_padda 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' widthargomento, formatessendo "d""integer" e a "0" flagper 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 formatCma 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 scalespacchetto ha diverse funzioni come percent, date_formate dollarper tipi di formati speciali.
data$anim = paste(rep(0, n), data$anim, sep = "")