Краткая версия: используйте 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 = "")