如何在R中将向量映射到不同的范围?

16

我有一个取值范围在[1,10]内的向量

c(1,2,9,10)

我希望将它映射到不同的范围,例如[12,102]

c(12,22,92,102)

R中是否有已经完成这个功能的函数?


你能解释一下你的映射吗?我不明白为什么2被映射到62,也不明白为什么270在里面,因为它超出了你的范围。 - David
抱歉@David,我把我用来理解问题的两个例子搞混了。它基本上是一种线性映射。 - nachocab
这应该很明显,但这不是一个关于 R 的问题。这是一个涉及基本线性代数的问题。 - Carl Witthoft
1个回答

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

更明确地说:

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包。还可以像@flodel建议的那样巧妙地利用approxfun

linMap <- function(x, a, b) approxfun(range(x), c(a, b))(x)

我在你的 linMaprescale 中发现了一个时间行为,在 R 3.3.2 中一些列会变成零。例如,all.dat <- c(2274959, 1531001)。你知道是为什么吗? - Léo Léopold Hertz 준영
@Masi,你所说的“时间行为”是什么意思?我猜all.dat在我的答案符号中代表x。那么fromto、你期望的输出以及你实际得到的输出是什么? - Julius Vainora
我得到了零列。 - Léo Léopold Hertz 준영

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接