Краткая версия: используйте formatCили sprintf.
Более длинная версия:
Для форматирования чисел доступно несколько функций, включая добавление начальных нулей. Какой из них лучше, зависит от того, какое форматирование вы хотите сделать.
Пример из вопроса довольно прост, так как все значения имеют одинаковое количество цифр для начала, поэтому давайте попробуем более сложный пример создания степеней шириной 10 и 8.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste(и его вариант paste0) часто являются первыми функциями обработки строк, с которыми вы сталкиваетесь. Они на самом деле не предназначены для манипулирования числами, но они могут быть использованы для этого. В простом случае, когда нам всегда нужно добавлять один ноль, paste0это лучшее решение.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Для случая, когда в числах есть переменное число цифр, вы должны вручную вычислить, сколько нулей нужно добавить, что достаточно ужасно, что вы должны делать это только из болезненного любопытства.
str_padиз stringrработ аналогично paste, делая более явным, что вы хотите дополнить вещи.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
Опять же, он на самом деле не предназначен для использования с числами, поэтому в более сложном случае нужно немного подумать. Мы должны просто сказать «pad with zeroes to width 8», но посмотрим на этот вывод:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Вы должны установить научный штрафной вариант , так что номера всегда отформатированы с использованием фиксированного обозначения (а не научная нотации).
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_padв stringiработах так же, как str_padиз stringr.
formatCпредставляет собой интерфейс для функции C printf. Для его использования требуется знание тайны этой базовой функции (см. Ссылку). В этом случае, важные моменты являются widthаргументом, formatбудучи "d"на «целое», и "0" flagдля Предварения нулей.
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"
Это мое любимое решение, поскольку с изменением ширины легко повременить, а функция достаточно мощная для внесения других изменений форматирования.
sprintfинтерфейс с одноименной функцией C; вроде бы formatCно с другим синтаксисом.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
Основное преимущество sprintfзаключается в том, что вы можете вставлять отформатированные числа в более длинные биты текста.
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."
Смотрите также товарный ответ .
Для полноты картины стоит упомянуть другие функции форматирования, которые иногда полезны, но не имеют метода добавления нулей.
format, универсальная функция для форматирования любого типа объекта, с методом для чисел. Это работает немного похоже formatC, но с еще одним интерфейсом.
prettyNumеще одна функция форматирования, в основном для создания ручных меток оси. Это работает особенно хорошо для широкого диапазона чисел.
scalesПакет имеет несколько функций , такие как percent, date_formatи dollarдля специалистов типов форматов.
data$anim = paste(rep(0, n), data$anim, sep = "")