Die Kurzversion: benutze formatC
oder sprintf
.
Die längere Version:
Zum Formatieren von Zahlen stehen verschiedene Funktionen zur Verfügung, einschließlich des Hinzufügens führender Nullen. Welche am besten ist, hängt davon ab, welche andere Formatierung Sie vornehmen möchten.
Das Beispiel aus der Frage ist recht einfach, da alle Werte zunächst die gleiche Anzahl von Ziffern haben. Versuchen wir also ein härteres Beispiel für die Herstellung von Potenzen mit einer Breite von 10 und 8.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(und seine Variante paste0
) sind oft die ersten Funktionen zur Manipulation von Zeichenfolgen, auf die Sie stoßen. Sie sind nicht wirklich für die Manipulation von Zahlen konzipiert, können aber dafür verwendet werden. In dem einfachen Fall, in dem wir immer eine einzelne Null voranstellen müssen, paste0
ist dies die beste Lösung.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Für den Fall, dass die Zahlen eine variable Anzahl von Ziffern enthalten, müssen Sie manuell berechnen, wie viele Nullen vorangestellt werden müssen. Dies ist schrecklich genug, dass Sie dies nur aus krankhafter Neugier tun sollten.
str_pad
from stringr
funktioniert ähnlich wie paste
und macht es deutlicher, dass Sie Dinge auffüllen möchten.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Auch hier ist es nicht wirklich für die Verwendung mit Zahlen konzipiert, daher erfordert der schwierigere Fall ein wenig Nachdenken. Wir sollten nur "Pad mit Nullen bis Breite 8" sagen können, aber schauen Sie sich diese Ausgabe an:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Sie müssen die Option für wissenschaftliche Strafen so einstellen , dass Zahlen immer mit fester Notation (und nicht mit wissenschaftlicher Notation) formatiert werden.
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
in stringi
funktioniert genau wie str_pad
ab stringr
.
formatC
ist eine Schnittstelle zur C-Funktion printf
. Die Verwendung erfordert einige Kenntnisse des Arcana dieser zugrunde liegenden Funktion (siehe Link). In diesem Fall sind die wichtigen Punkte der width
Argumentation, format
wobei "d"
für „integer“ und eine "0"
flag
für das Voranstellen von Nullen.
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"
Dies ist meine Lieblingslösung, da es einfach ist, die Breite zu ändern, und die Funktion leistungsfähig genug ist, um andere Formatierungsänderungen vorzunehmen.
sprintf
ist eine Schnittstelle zur gleichnamigen C-Funktion; wie formatC
aber mit einer anderen Syntax.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
Der Hauptvorteil von sprintf
ist, dass Sie formatierte Zahlen in längere Textbits einbetten können.
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."
Siehe auch die Antwort von goodside .
Der Vollständigkeit halber sind die anderen Formatierungsfunktionen zu erwähnen, die gelegentlich nützlich sind, aber keine Methode zum Voranstellen von Nullen haben.
format
, eine generische Funktion zum Formatieren von Objekten aller Art mit einer Methode für Zahlen. Es funktioniert ein bisschen wie formatC
, aber mit noch einer anderen Schnittstelle.
prettyNum
ist eine weitere Formatierungsfunktion, hauptsächlich zum Erstellen manueller Achsen-Tick-Beschriftungen. Es funktioniert besonders gut für große Zahlenbereiche.
Das scales
Paket hat mehrere Funktionen wie percent
, date_format
und dollar
für die Fachformattypen.
data$anim = paste(rep(0, n), data$anim, sep = "")