Краткая версия: используйте formatC
или _ 2_.
Более длинная версия:
Для форматирования чисел доступно несколько функций, включая добавление начальных нулей. Какой из них лучше, зависит от того, какое еще форматирование вы хотите сделать.
Пример из вопроса довольно прост, поскольку все значения имеют одинаковое количество цифр в начале, поэтому давайте попробуем более сложный пример создания степеней 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"
Опять же, он на самом деле не предназначен для использования с числами, поэтому более сложный случай требует некоторого размышления. Мы должны просто иметь возможность сказать «набивка с нулями до ширины 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 _ 19_. Для его использования требуется некоторое знание тайн этой базовой функции (см. Ссылку). В этом случае важными моментами являются 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."
См. Также ответ goodside.
Для полноты картины стоит упомянуть другие функции форматирования, которые иногда могут быть полезны, но не имеют метода добавления нулей в начале.
format
, общая функция для форматирования любых объект, с методом для чисел. Он работает немного как formatC
, но с еще одним интерфейсом.
prettyNum
- еще одна функция форматирования, в основном для создания метки деления оси вручную. Это особенно хорошо работает для широкого диапазона чисел.
Пакет scales
имеет несколько функций, таких как percent
, date_format
и _ 37_ для специальных типов форматов.
person
Richie Cotton
schedule
28.04.2011
data$anim = paste(rep(0, n), data$anim, sep = "")
- person Ramnath   schedule 28.04.2011