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