r - Replace element in vector based on first letter of character string -
consider vectors below:
id <- c("a1","b1","c1","a12","b2","c2","av1") names <- c("alpha","bravo","charlie","avocado")
i want replace first character of each element in vector id
vector names
based on first letter of vector names
. want add _0
before each number between 0:9
.
note elements av1
, avocado
throw things off bit, lowercase v
in av1
.
the result should this:
res <- c("alpha_01","bravo_01","charlie_01","alpha_12","bravo_02","charlie_02", "avocado_01")
i know should done regex
i've been trying 2 days , haven't got anywhere.
we can use gsubfn
.
library(gsubfn) #remove number part 'id' (using `sub`) , unique elements nm1 <- unique(sub("\\d+", "", id)) #using gsubfn, replace non-numeric elements matching #key/value pair in replacement #finally format add "_" sub sub("(\\d+)$", "_0\\1", gsubfn("(\\d+)", as.list(setnames(names, nm1)), id)) #[1] "alpha_01" "bravo_01" "charlie_01" "alpha_02" #[5] "bravo_02" "charlie_02" "avocado_01"
the (\\d+)
indicates 1 or more numeric elements, , (\\d+)
1 or more non-numeric elements. wrapping within brackets capture group , replace backreference (\\1
- first backreference captured group).
update
if condition append 0 'id's have numbers less 10, can second gsubfn
, sprintf
gsubfn("(\\d+)", ~sprintf("_%02d", as.numeric(x)), gsubfn("(\\d+)", as.list(setnames(names, nm1)), id)) #[1] "alpha_01" "bravo_01" "charlie_01" "alpha_12" #[5] "bravo_02" "charlie_02" "avocado_01"
Comments
Post a Comment