Коротка версія: використовувати 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"
Знову ж таки, він насправді не призначений для використання з номерами, тому складніший випадок вимагає трохи подумати. Ми повинні просто мати можливість сказати "колодка з нулями до ширини 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."
Дивіться також відповідь Goodside .
Для повноти варто згадати інші функції форматування, які періодично корисні, але не мають методу попередження нулів.
format
, загальна функція для форматування будь-якого виду об'єктів із методом числення. Це працює трохи схоже formatC
, але з ще одним інтерфейсом.
prettyNum
- це ще одна функція форматування, в основному для створення ручних міток для осі. Це особливо добре працює для широкого діапазону чисел.
scales
Пакет має кілька функцій , такі як percent
, date_format
і dollar
для фахівців типів форматів.
data$anim = paste(rep(0, n), data$anim, sep = "")