I am trying to repair a list of supposedly monotonically and smoothly ascending numbers, like a CDF. An example would be like

aa={1,2,3,4,5,100,200,300,400,500,30,31,32,33,34,35};
bb=Differences[aa]


The objective is to scale up the first five elements to synch up with the sixth which is 100, and then to scale down the first ten elements to bring the first ten elements of the revised list to line up with the remaining six elements.

I have tried the following

MapThread[If[#1>90||#1<-10,MapThread[ReplacePart[aa,#2*Position[bb,#1+1]/Position[bb,#1]]&,{aa[[1;;Position[bb,#2]]]}]&,{bb}]


Apparently, #1 for the first MapThread and #2 for the second MapThread were not executed as intended. Any suggestions or corrections will be much appreciated.

• Please fix the syntax error in MapThread... Also, please add the list result you want. There may be an easier way to solve the problem. Sep 2, 2021 at 0:01
• kglr: Will do. Thanks for the reminder Sep 2, 2021 at 3:16

You can use a combination of Split + Fold + Rescale as follows:

split = Split[aa, .5 < #2/# < 3 &]

{{1, 2, 3, 4, 5}, {100, 200, 300, 400, 500}, {30, 31, 32, 33, 34, 35}}

cc = N @ Fold[Join[Rescale[#, {First@#, Last@#}, First /@ {#, #2}], #2] &, split]

{1., 2.43838, 3.87675, 5.31513, 6.75351, 6.75351, 12.5651, 18.3768, 24.1884,
30., 30., 31., 32., 33., 34., 35.}

ListPlot[{aa, cc}, PlotRange -> All, Joined -> {False, True}]


Use FoldList to see all steps:

N@FoldList[Join[Rescale[#, {First@#, Last@#}, First /@ {#, #2}], #2] &, split] // Column


• This suggestion is simple and yet works nicely except for its logic or rationale: the use of # and #1 for two subsequent elements of a set instead of two separate sets seems unique. Thanks for the answer. Sep 8, 2021 at 16:31