Die Kurzversion: benutze formatCoder 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, paste0ist 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_padfrom stringrfunktioniert ähnlich wie pasteund 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_padin stringifunktioniert genau wie str_padab stringr.
formatCist 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 widthArgumentation, formatwobei "d"für „integer“ und eine "0" flagfü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.
sprintfist eine Schnittstelle zur gleichnamigen C-Funktion; wie formatCaber 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 sprintfist, 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.
prettyNumist eine weitere Formatierungsfunktion, hauptsächlich zum Erstellen manueller Achsen-Tick-Beschriftungen. Es funktioniert besonders gut für große Zahlenbereiche.
Das scalesPaket hat mehrere Funktionen wie percent, date_formatund dollarfür die Fachformattypen.
data$anim = paste(rep(0, n), data$anim, sep = "")