Ответ 1
Краткая версия: используйте 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 с нулями до ширины 8", но посмотрите на этот вывод:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
Вам нужно установить научный штраф option, чтобы числа всегда форматировались с использованием фиксированной нотации (а не научной нотации).
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"
для "integer" и a "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
для специальных типов форматов.