Wersja skrócona: użyj formatC
lub sprintf
.
Dłuższa wersja:
Dostępnych jest kilka funkcji formatowania liczb, w tym dodawanie zer wiodących. Wybór najlepszego zależy od tego, jakie inne formatowanie chcesz wykonać.
Przykład z pytania jest dość łatwy, ponieważ wszystkie wartości mają na początku tę samą liczbę cyfr, więc spróbujmy trudniejszego przykładu tworzenia potęg 10 o szerokości 8.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(i jest to wariant paste0
) są często pierwszymi napotkanymi funkcjami manipulacji ciągami. Nie są tak naprawdę zaprojektowane do manipulowania liczbami, ale można do tego użyć. W prostym przypadku, w którym zawsze musimy wstawić jedno zero, paste0
jest najlepszym rozwiązaniem.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
W przypadku, gdy w liczbach jest zmienna liczba cyfr, musisz ręcznie obliczyć liczbę zer do uzupełnienia, co jest na tyle okropne, że powinieneś to zrobić tylko z chorobliwej ciekawości.
str_pad
od stringr
działa podobnie do paste
, czyniąc bardziej wyraźnym, że chcesz uzupełniać.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Ponownie, nie jest tak naprawdę przeznaczony do używania z liczbami, więc trudniejszy przypadek wymaga trochę myślenia. Powinniśmy być w stanie powiedzieć „pad z zerami do szerokości 8”, ale spójrzmy na ten wynik:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Musisz ustawić opcję kary naukowej , aby liczby były zawsze formatowane przy użyciu stałej notacji (a nie notacji naukowej).
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
w stringi
dziełach dokładnie takich jak str_pad
z stringr
.
formatC
jest interfejsem funkcji C printf
. Korzystanie z niej wymaga pewnej wiedzy na temat arkanów tej podstawowej funkcji (patrz link). W tym przypadku ważne punkty są width
argumentem, format
będąc "d"
na „całkowitą”, a "0"
flag
na poprzedzenie zerami.
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"
To moje ulubione rozwiązanie, ponieważ łatwo jest majstrować przy zmianie szerokości, a funkcja jest wystarczająco potężna, aby dokonywać innych zmian formatowania.
sprintf
jest interfejsem do funkcji C o tej samej nazwie; jak, formatC
ale z inną składnią.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
Główną zaletą sprintf
jest to, że można osadzić sformatowane liczby w dłuższych fragmentach tekstu.
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."
Zobacz także odpowiedź goodside .
Dla kompletności warto wspomnieć o innych funkcjach formatowania, które okazjonalnie są przydatne, ale nie mają metody dodawania zer.
format
, ogólna funkcja do formatowania dowolnego rodzaju obiektu, z metodą liczbową. Działa trochę podobnie formatC
, ale z jeszcze innym interfejsem.
prettyNum
to kolejna funkcja formatowania, głównie do tworzenia ręcznych etykiet zaznaczenia osi. Działa szczególnie dobrze w szerokim zakresie liczb.
scales
Pakiet ma kilka funkcji, takich jak percent
, date_format
i dollar
dla typów formatów specjalistycznych.
data$anim = paste(rep(0, n), data$anim, sep = "")