У меня есть вектор символов со строками аналогичного формата (буквы, подчеркивания, цифры):
v <- c("AB_124", "BAE_1", "LOED_1234", "H_01")
Я хочу добавить ведущие нули, чтобы иметь длину 4 для числовой части:
c("AB_0124", "BAE_0001", "LOED_1234", "H_0001")
Какие есть способы сделать это?





Один из способов сделать это (но я нахожу его немного громоздким) — разделить и воссоединить:
sapply(strsplit(v, "_"), \(x) {x[2] <- sprintf("%04d", as.numeric(x[2])); paste(x, collapse = "_")})
#[1] "AB_0124" "BAE_0001" "LOED_1234" "H_0001"
Использование регулярного выражения:
sprintf("%s_%04d", substr(v, 1, regexpr("_", v) - 1),
as.numeric(substring(v, regexpr("_", v) + 1)))
# [1] "AB_0124" "BAE_0001" "LOED_1234" "H_0001"
Или стрингер:
library(stringr)
str_replace(v, "(\\d+)$", ~sprintf("%04d", as.numeric(.x)))
# [1] "AB_0124" "BAE_0001" "LOED_1234" "H_0001"
Немного более простая версия вашего решения sapply:
sapply(strsplit(v, "_"), \(x){ sprintf("%s_%04d", x[1], as.numeric(x[2])) })
# [1] "AB_0124" "BAE_0001" "LOED_1234" "H_0001"
@DarrenTsai хороший, спасибо, отредактировано.
мы также можем использовать str_extract с sprintf как sprintf('%s%04d',str_extract(v,'^\\w+\\_'),as.numeric(str_extract(v,'\\d+')))
Решение stringr, которое предоставляет функцию (например, str_pad) в str_replace() для замены совпадения.
library(stringr)
str_replace(v, "(\\d+)$", ~ str_pad(.x, 4, pad = 0))
# [1] "AB_0124" "BAE_0001" "LOED_1234" "H_0001"
Небольшая вариация с использованием функции data.tabletstrsplit
s <- data.table::tstrsplit(v, "_", type.convert = TRUE)
sprintf("%s_%04d", s[[1]], s[[2]])
# [1] "AB_0124" "BAE_0001" "LOED_1234" "H_0001"
Ваше решение
stringrможно немного упростить какstr_replace(v, "(\\d+)$", ~ sprintf("%04d", as.numeric(.x)))