为了账号安全,请及时绑定邮箱和手机立即绑定

在两点之间缩放系列

/ 猿问

在两点之间缩放系列

慕村9548890 2019-09-24 16:36:21

我如何缩放系列,以使系列中的第一个数字为0,最后一个数字为1。我研究了“大约”,“缩放”,但它们没有达到此目的。


# 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)


查看完整描述

3 回答

?
喵喔喔

使用基本算法创建一个简单的函数可以很容易地做到这一点:


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


查看完整回答
反对 回复 2019-09-24
?
波斯汪

该scales软件包具有一个可以为您完成此任务的功能:rescale。


library("scales")

rescale(s)

默认情况下,这会将给定范围从s0 缩放到1,但是可以调整其中一个或两个。例如,如果您希望将其从0缩放到10,


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

或者如果您希望将最大值s缩放为1,但将0(而不是的最小值s)缩放为0,则可以使用


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


查看完整回答
反对 回复 2019-09-24
?
收到一只叮咚

应该这样做:


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

编辑


我对这两种方法的性能感到好奇


> 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 

从中提取原始代码 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 

产生相似的结果。


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 80 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信