Это должно работать.
По сути, мы делим работу на две части, сначала сопоставляем ("_(S[0-9+])"
), затем разбиваем полученную строку на "-"
, затем используем gsub
, чтобы исправить все найденные "_"
.
foo <- c("H2_2months_S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_")
foo <- gsub(pattern="_(S[0-9+])", replacement="-\\1", x=foo)
#foo
#[1] "H2_2months-S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"
Тогда мы разделим:
split <- unlist(strsplit(foo, "-")) # split using the new "-"
#split
#[1] "H2_2months"
#[2] "S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"
Теперь мы можем использовать простой gsub
для всего, кроме последнего элемента в split
.
split_1 <- split[-length(split)] # fix all the "_" before the match (exclude the last)
split_1 <- gsub("_", "-", split_1)
Тогда мы paste
Результаты:
paste0(split_1, "-", split[length(split)]) # paste back together
#[1] "H2-2months-S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"
Здесь, в функции и другом примере:
foo <- c("H2_2months_abc_456_S123_L001_R1_001")
my_foo <- function(s) {
s <- gsub(pattern="_(S[0-9+])", replacement="-\\1", x=s)
split <- unlist(strsplit(s, "-"))
split_1 <- split[-length(split)]
split_1 <- gsub("_", "-", split_1)
paste0(split_1, "-", split[length(split)])
}
my_foo(foo)
#[1] "H2-2months-abc-456-S123_L001_R1_001"