16

I have a vector in the range [1,10]

c(1,2,9,10)

and I want to map it to a different range, for example [12,102]

c(12,22,92,102)

Is there a function that already does this in R?

nachocab
  • 13,328
  • 21
  • 91
  • 149
  • Can you explain your mapping? I don't understand why 2 is mapped to 62 or why 270 is in there at all since it falls outside of your range. – David Aug 18 '13 at 20:45
  • Sorry @David, I mixed up two examples I was using to understand the problem. It's basically a linear mapping. – nachocab Aug 18 '13 at 20:48
  • This should be obvious, but this is not an `R` question. It's a question concerning basic linear algebra. – Carl Witthoft Aug 19 '13 at 11:26

1 Answers1

20
linMap <- function(x, from, to)
  (x - min(x)) / max(x - min(x)) * (to - from) + from

linMap(vec, 12, 102)
# [1]  12  22  92 102

Or more explicitly:

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)) works using the package scales. Also one could exploit approxfun in a clever way as suggested by @flodel:

linMap <- function(x, a, b) approxfun(range(x), c(a, b))(x)
Julius Vainora
  • 47,421
  • 9
  • 90
  • 102