Die Kurzversion: Verwenden Sie formatC
o sprintf
.
Die längere Version:
Für die Formatierung von Zahlen stehen mehrere Funktionen zur Verfügung, darunter das Hinzufügen führender Nullen. Welche Funktion am besten geeignet ist, hängt davon ab, welche anderen Formatierungen 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 es also mit einem schwierigeren Beispiel, bei dem es darum geht, Potenzen von 10 mit 8 zu bilden.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(und seine Variante paste0
) sind oft die ersten Funktionen zur Manipulation von Zeichenketten, die Sie kennenlernen. Sie sind eigentlich nicht für die Manipulation von Zahlen gedacht, aber sie können dafür verwendet werden. In dem einfachen Fall, dass wir immer eine einzelne Null voranstellen müssen, paste0
ist 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 voranzustellen sind, was so schrecklich ist, dass Sie es nur aus krankhafter Neugier tun sollten.
str_pad
de stringr
funktioniert ähnlich wie paste
Dadurch wird deutlicher, dass Sie die Dinge auffüllen wollen.
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 ausgelegt, so dass der härtere Fall ein wenig Überlegung erfordert. Wir sollten in der Lage sein, einfach zu sagen: "Pad mit Nullen auf Breite 8", aber sehen Sie sich diese Ausgabe an:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Sie müssen die wissenschaftliche Strafe festlegen Option damit die Zahlen immer in fester Notation (und nicht in 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
en stringi
funktioniert genau wie str_pad
de stringr
.
formatC
ist eine Schnittstelle zu der C-Funktion printf
. Die Verwendung dieser Funktion erfordert einige Kenntnisse über die zugrunde liegende Funktion (siehe Link). In diesem Fall sind die wichtigsten Punkte die width
Argument, format
unter "d"
für "Ganzzahl" und ein "0"
flag
um Nullen voranzustellen.
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 bevorzugte Lö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 zu der 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 Textabschnitte 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 Antwort von goodside .
Der Vollständigkeit halber sollten auch die anderen Formatierungsfunktionen erwähnt werden, die gelegentlich nützlich sind, aber keine Methode zum Voranstellen von Nullen haben.
format
, eine allgemeine Funktion zur Formatierung beliebiger Objekte, mit einer Methode für Zahlen. Sie funktioniert ein wenig wie formatC
, aber mit einer anderen Schnittstelle.
prettyNum
ist eine weitere Formatierungsfunktion, die hauptsächlich zur Erstellung manueller Achsenbeschriftungen dient. Sie eignet sich besonders gut für große Zahlenbereiche.
En scales
Paket hat mehrere Funktionen wie percent
, date_format
y dollar
für spezielle Formattypen.
9 Stimmen
Angenommen, Sie möchten n Nullen vor den Tier-IDs hinzufügen, dann müssen Sie nur Folgendes tun
data$anim = paste(rep(0, n), data$anim, sep = "")
3 Stimmen
Wenn Sie sagen, dass Sie "Nullen hinzufügen" möchten, möchten Sie vermutlich nicht Ihre Integer-Spalten in String/Kategorisch konvertieren, um die Nullen in den Daten selbst hinzuzufügen, sondern Sie möchten sie ganzzahlig lassen und beim Rendern der Ausgabe nur führende Nullen ausgeben .