Ich habe einen Datensatz, der ungefähr so aussieht:
anim <- c(25499,25500,25501,25502,25503,25504)
sex <- c(1,2,2,1,2,1)
wt <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)
data
anim sex wt anim2
1 25499 1 0.8 2
2 25500 2 1.2 2
3 25501 2 1.0 2
4 25502 1 2.0 2
5 25503 2 1.8 2
6 25504 1 1.4 2
Ich möchte, dass vor jeder Tier-ID eine Null hinzugefügt wird:
data
anim sex wt anim2
1 025499 1 0.8 2
2 025500 2 1.2 2
3 025501 2 1.0 2
4 025502 1 2.0 2
5 025503 2 1.8 2
6 025504 1 1.4 2
Und was ist aus Interesse, wenn ich zwei oder drei Nullen vor den Tier-IDs hinzufügen muss?
data$anim = paste(rep(0, n), data$anim, sep = "")
Antworten:
Die Kurzversion: benutze
formatC
odersprintf
.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.
paste
(und seine Variantepaste0
) 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.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
fromstringr
funktioniert ähnlich wiepaste
und macht es deutlicher, dass Sie Dinge auffüllen möchten.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:
Sie müssen die Option für wissenschaftliche Strafen so einstellen , dass Zahlen immer mit fester Notation (und nicht mit wissenschaftlicher Notation) formatiert werden.
stri_pad
instringi
funktioniert genau wiestr_pad
abstringr
.formatC
ist eine Schnittstelle zur C-Funktionprintf
. Die Verwendung erfordert einige Kenntnisse des Arcana dieser zugrunde liegenden Funktion (siehe Link). In diesem Fall sind die wichtigen Punkte derwidth
Argumentation,format
wobei"d"
für „integer“ und eine"0"
flag
für das Voranstellen von Nullen.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; wieformatC
aber mit einer anderen Syntax.Der Hauptvorteil von
sprintf
ist, dass Sie formatierte Zahlen in längere Textbits einbetten können.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 wieformatC
, 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 wiepercent
,date_format
unddollar
für die Fachformattypen.quelle
flag = "0"
.?sprintf
Hilfeseite beschreibt dies. "mn: Zwei durch einen Punkt getrennte Zahlen, die die Feldbreite (m) und die Genauigkeit (n) angeben."data$anim
Verwenden Sie diesprintf
Funktion für eine allgemeine Lösung, die unabhängig von der Anzahl der Ziffern funktioniert. Es funktioniert so:In Ihrem Fall möchten Sie wahrscheinlich:
data$anim <- sprintf("%06d", data$anim)
quelle
sprintf
numerisch in Zeichenfolge (Zeichen) konvertiert wird.Erweiterung der Antwort von @ goodside:
In einigen Fällen möchten Sie möglicherweise eine Zeichenfolge mit Nullen auffüllen (z. B. Fips-Codes oder andere numerische Faktoren). In OSX / Linux:
Da
sprintf()
der hier beschriebenesprintf()
Befehl C des Betriebssystems aufgerufen wird , erhalten Sie in Windows 7 ein anderes Ergebnis:Auf Windows-Computern lautet die Problemumgehung also:
quelle
str_pad
ist jetzt mein go to.str_pad
aus demstringr
Paket ist eine Alternative.quelle
str_pad
da dies zu unerwarteten Ergebnissen führen kann.i.num = 600000
;;str_pad(i.num, width = 7, pad = "0")
gibt Ihnen "006e + 05" und nicht "0600000"Hier ist eine verallgemeinerbare Basis-R-Funktion:
Ich mag,
sprintf
aber es kommt mit Vorbehalten wie:quelle
Hier ist eine weitere Alternative zum Hinzufügen von führenden Nullen zu Zeichenfolgen wie CUSIPs, die manchmal wie eine Zahl aussehen können und bei denen viele Anwendungen wie Excel die führenden Nullen beschädigen und entfernen oder sie in wissenschaftliche Notation konvertieren.
Als ich die Antwort von @metasequoia versuchte, hatte der zurückgegebene Vektor führende Leerzeichen und nicht
0
s. Dies war das gleiche Problem, das von @ user1816679 erwähnt wurde - und das Entfernen der Anführungszeichen um das0
oder das Ändern von%d
zu%s
machte auch keinen Unterschied. Zu Ihrer Information, ich verwende RStudio Server, der auf einem Ubuntu-Server ausgeführt wird. Diese kleine zweistufige Lösung hat bei mir funktioniert:gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))
Mit der
%>%
Pipe-Funktion aus demmagrittr
Paket könnte es so aussehen:sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)
Ich würde eine Lösung mit einer Funktion bevorzugen, aber sie funktioniert.
quelle
quelle
paste0(0, data$anim)
Würde einfach gut funktionieren.Für andere Umstände, unter denen die Zahlenzeichenfolge konsistent sein soll, habe ich eine Funktion erstellt.
Jemand könnte dies nützlich finden:
Entschuldigung für die Formatierung.
quelle