Вот пять вариантов.Вам нужен только один из них, выберите тот, который соответствует вашему ожидаемому результату и предпочтениям.
library(dplyr)
tibble(values = c(1, 10, 100, 900, 1000, 2000)) %>%
mutate(
x1 = sprintf("AG%05.0f", values),
x2 = paste0(ifelse(values > 999, "AG0", "AG00"), values),
x3 = paste0(case_when(
values > 999 ~ "AG0",
TRUE ~ "AG00"), values),
x4 = paste0(case_when(
values > 999 ~ "AG0",
values > 99 ~ "AG00",
values > 9 ~ "AG000",
TRUE ~ "AG0000"), values),
# suggested by @Frank
x5 = paste0("AG", strrep("0", 5-nchar(values)), values)
)
# # A tibble: 6 x 6
# values x1 x2 x3 x4 x5
# <dbl> <chr> <chr> <chr> <chr> <chr>
# 1 1 AG00001 AG001 AG001 AG00001 AG00001
# 2 10 AG00010 AG0010 AG0010 AG00010 AG00010
# 3 100 AG00100 AG00100 AG00100 AG00100 AG00100
# 4 900 AG00900 AG00900 AG00900 AG00900 AG00900
# 5 1000 AG01000 AG01000 AG01000 AG01000 AG01000
# 6 2000 AG02000 AG02000 AG02000 AG02000 AG02000
И если по какой-то причине их более нескольких сотен, возможно, производительность является проблемой:
set.seed(2)
# Browse[4]>
bigvalues <- sample(1e4, size=1e3)+1
# Browse[4]>
head(bigvalues)
# [1] 1850 7025 5734 1682 9436 9432
# Browse[4]>
microbenchmark::microbenchmark(
x1 = sprintf("AG%05.0f", bigvalues),
x2 = paste0(ifelse(bigvalues > 999, "AG0", "AG00"), bigvalues),
x3 = paste0(case_when(
bigvalues > 999 ~ "AG0",
TRUE ~ "AG00"), bigvalues),
x4 = paste0(case_when(
bigvalues > 999 ~ "AG0",
bigvalues > 99 ~ "AG00",
bigvalues > 9 ~ "AG000",
TRUE ~ "AG0000"), bigvalues),
x5 = paste0("AG", strrep("0", 5-nchar(bigvalues)), bigvalues)
)
# Unit: microseconds
# expr min lq mean median uq max neval
# x1 548.0 567.95 614.107 603.65 634.55 953.6 100
# x2 1084.7 1150.90 1239.094 1191.75 1250.60 1854.0 100
# x3 1018.0 1070.35 1127.585 1104.50 1137.25 1693.2 100
# x4 1092.6 1144.30 1226.597 1177.20 1224.25 2251.2 100
# x5 1880.5 1970.15 2058.329 2011.00 2055.60 4035.4 100
(Извините, Франк.)