Wersja skrócona: użyj formatClub 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, paste0jest 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_padod stringrdział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_padw stringidziełach dokładnie takich jak str_padz stringr.
formatCjest 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ą widthargumentem, formatbędąc "d"na „całkowitą”, a "0" flagna 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.
sprintfjest interfejsem do funkcji C o tej samej nazwie; jak, formatCale 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ą sprintfjest 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.
prettyNumto kolejna funkcja formatowania, głównie do tworzenia ręcznych etykiet zaznaczenia osi. Działa szczególnie dobrze w szerokim zakresie liczb.
scalesPakiet ma kilka funkcji, takich jak percent, date_formati dollardla typów formatów specjalistycznych.
data$anim = paste(rep(0, n), data$anim, sep = "")