linMap <- function(x, from, to)
(x - min(x))/max(x - min(x)) * (to - from) + from
linMap(vec, 12, 102)
# [1] 12 22 92 102
Hoặc một cách rõ ràng hơn:
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))
công trình sử dụng các gói scales
. Ngoài ra, người ta có thể khai thác approxfun
một cách thông minh theo đề xuất của @flodel:
linMap <- function(x, a, b) approxfun(range(x), c(a, b))(x)
Bạn có thể giải thích bản đồ của mình không? Tôi không hiểu tại sao 2 được ánh xạ tới 62 hoặc lý do tại sao 270 là ở đó vì nó nằm ngoài phạm vi của bạn. – David
Xin lỗi @David, tôi đã trộn lẫn hai ví dụ mà tôi đã sử dụng để hiểu sự cố. Về cơ bản nó là một ánh xạ tuyến tính. – nachocab
Điều này phải rõ ràng, nhưng đây không phải là câu hỏi 'R'. Đó là một câu hỏi liên quan đến đại số tuyến tính cơ bản. –