Escala de uma série entre dois pontos

Como faço para escala de uma série de tal forma que o primeiro número da série é 0 e último número é 1. Eu olhei em ‘approx’, ‘scale’, mas eles não atingem esse objective.

# generate series from exponential distr s = sort(rexp(100)) # scale/interpolate 's' such that it starts at 0 and ends at 1? # approx(s) # scale(s) 

É simples para criar uma pequena function para fazer isso usando aritmética básica:

 s = sort(rexp(100)) range01 < - function(x){(x-min(x))/(max(x)-min(x))} range01(s) [1] 0.000000000 0.003338782 0.007572326 0.012192201 0.016055006 0.017161145 [7] 0.019949532 0.023839810 0.024421602 0.027197168 0.029889484 0.033039408 [13] 0.033783376 0.038051265 0.045183382 0.049560233 0.056941611 0.057552543 [19] 0.062674982 0.066001242 0.066420884 0.067689067 0.069247825 0.069432174 [25] 0.070136067 0.076340460 0.078709590 0.080393512 0.085591881 0.087540132 [31] 0.090517295 0.091026499 0.091251213 0.099218526 0.103236344 0.105724733 [37] 0.107495340 0.113332392 0.116103438 0.124050331 0.125596034 0.126599323 [43] 0.127154661 0.133392300 0.134258532 0.138253452 0.141933433 0.146748798 [49] 0.147490227 0.149960293 0.153126478 0.154275371 0.167701855 0.170160948 [55] 0.180313542 0.181834891 0.182554291 0.189188137 0.193807559 0.195903010 [61] 0.208902645 0.211308713 0.232942314 0.236135220 0.251950116 0.260816843 [67] 0.284090255 0.284150541 0.288498370 0.295515143 0.299408623 0.301264703 [73] 0.306817872 0.307853369 0.324882091 0.353241217 0.366800517 0.389474449 [79] 0.398838576 0.404266315 0.408936260 0.409198619 0.415165553 0.433960390 [85] 0.440690262 0.458692639 0.464027428 0.474214070 0.517224262 0.538532221 [91] 0.544911543 0.559945121 0.585390414 0.647030109 0.694095422 0.708385079 [97] 0.736486707 0.787250428 0.870874773 1.000000000 

O pacote de scales tem uma function que fará isso para você: rescale .

 library("scales") rescale(s) 

Por padrão, isso dimensiona o intervalo dado de s para 0 a 1, mas um deles ou ambos podem ser ajustados. Por exemplo, se você quiser escalar de 0 a 10,

 rescale(s, to=c(0,10)) 

ou se você quiser o maior valor de s escalado para 1, mas 0 (em vez do menor valor de s ) dimensionado para 0, você pode usar

 rescale(s, from=c(0, max(s))) 

Isso deve servir:

 reshape::rescaler.default(s, type = "range") 

EDITAR

Eu estava curioso sobre o desempenho dos dois methods

 > system.time(replicate(100, range01(s))) user system elapsed 0.56 0.12 0.69 > system.time(replicate(100, reshape::rescaler.default(s, type = "range"))) user system elapsed 0.53 0.18 0.70 

Extraindo o código bruto da reshape::rescaler.default

 range02 < - function(x) { (x - min(x, na.rm=TRUE)) / diff(range(x, na.rm=TRUE)) } > system.time(replicate(100, range02(s))) user system elapsed 0.56 0.12 0.68 

Produz resultado semelhante.

Alternativamente:

 scale(x,center=min(x),scale=diff(range(x))) 

(não testado)

Você também pode fazer uso do pacote de caret que fornecerá a function preProcess que é simples assim:

 preProcValues < - preProcess(yourData, method = "range") dataScaled <- predict(preProcValues, yourData) 

Mais detalhes sobre a ajuda do pacote .