我有一个取值范围在[1,10]
内的向量
c(1,2,9,10)
我希望将它映射到不同的范围,例如[12,102]
c(12,22,92,102)
R中是否有已经完成这个功能的函数?
我有一个取值范围在[1,10]
内的向量
c(1,2,9,10)
我希望将它映射到不同的范围,例如[12,102]
c(12,22,92,102)
R中是否有已经完成这个功能的函数?
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)
linMap
和 rescale
中发现了一个时间行为,在 R 3.3.2 中一些列会变成零。例如,all.dat <- c(2274959, 1531001)
。你知道是为什么吗? - Léo Léopold Hertz 준영all.dat
在我的答案符号中代表x
。那么from
、to
、你期望的输出以及你实际得到的输出是什么? - Julius Vainora
R
的问题。这是一个涉及基本线性代数的问题。 - Carl Witthoft