Короткая версия: используйте 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
для специалиста типы форматов.