2013-08-18 65 views
12

Tôi có một vector trong khoảng [1,10]Làm thế nào để ánh xạ một vector đến một phạm vi khác trong R?

c(1,2,9,10) 

và tôi muốn để ánh xạ nó vào một phạm vi khác nhau, ví dụ [12,102]

c(12,22,92,102) 

Có một chức năng đã thực hiện điều này vào R?

+0

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

+0

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

+0

Đ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. –

Trả lời

15
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) 
+0

Tôi có một hành vi tạm thời trong 'linMap' và' rescale' của bạn, trong đó một số cột sẽ chuyển thành số không trong R 3.3.2. Các giá trị ví dụ 'all.dat <- c (2274959, 1531001)'. Bạn có biết tại sao? –

+0

@Masi, bạn có ý nghĩa gì bởi hành vi thời gian? Tôi cho rằng 'all.dat' là' x' trong ký hiệu câu trả lời của tôi. Sau đó, 'từ',' đến', kết quả mong đợi của bạn và những gì bạn đang nhận được thay thế? – Julius

+0

Tôi nhận được 0 cột. –

Các vấn đề liên quan