R не имеет возможности применить функцию непосредственно к совпадению через gsub
. Вам действительно нужно извлечь совпадение, преобразовать значение, а затем заменить значение. С функцией regmatches
это легко релятивируется. Например,
x<-"(990283)M (31)O (29)M (6360)M"
f<-function(x) {
v<-as.numeric(substr(x,2,nchar(x)-1))
paste0(v+5,".1")
}
m <- gregexpr("\\(\\d+\\)", x)
regmatches(x, m) <- lapply(regmatches(x, m), f)
x
# [1] "990288.1M 36.1O 34.1M 6365.1M"
Конечно, вы можете сделать f
делать все, что вам нравится, просто убедиться, что он удобен для вектора. Конечно, вы можете обернуть это в свою собственную функцию
gsubf <- function(pattern, x, f) {
m <- gregexpr(pattern, x)
regmatches(x, m) <- lapply(regmatches(x, m), f)
x
}
gsubf("\\(\\d+\\)", x, f)
. Обратите внимание, что в этих примерах мы не используем группу захвата, мы просто хватаем весь матч. Есть способы извлечь группы захвата, но они немного беспорядочны. Если вы хотите представить пример, где требуется такое извлечение, я мог бы придумать что-то более приятное.