linMap <- function(x, from, to) {
# Shifting the vector so that min(x) == 0
x <- x - min(x)
# Scaling to the range of [0, 1]
x <- x / max(x)
# Scaling to the needed amplitude
x <- x * (to - from)
# Shifting to the needed level
x + from
}
rescale(vec, c(12, 102)) работает с пакетом scales. Также можно использовать approxfun умным способом, как это было предложено @flodel:
linMap <- function(x, a, b) approxfun(range(x), c(a, b))(x)