2014-06-01 15:18 GMT+02:00 Michael Brand : > Hi Cecil > > On Sun, Jun 1, 2014 at 2:24 PM, Cecil Westerhof > wrote: > > But what if I would want to know the > > difference between the previous filled one, divided by the distance? > > > > For example: > > |-------+------------| > > | value | difference | > > |-------+------------| > > | 12 | | > > | 15 | 3 | > > | | | > > | 83 | 34 | > > | | | > > | | | > > | | | > > | 87 | 1 | > > | | | > > | | | > > | | | > > | 85 | -0.5 | > > | | | > > |-------+------------| > > More as a demonstration of what Calc can do, divided up into some > intermediate steps: > > |-------+---------------------------------------------------------| > | value | difference | > |-------+---------------------------------------------------------| > | 12 | | > | 15 | [15, 12] | > | | | > | 83 | [83, nan, 15, 12] | > | | | > | | | > | | | > | 87 | [87, nan, nan, nan, 83, nan, 15, 12] | > | | | > | | | > | | | > | 85 | [85, nan, nan, nan, 87, nan, nan, nan, 83, nan, 15, 12] | > | | | > |-------+---------------------------------------------------------| > #+TBLFM: $2 = if(vlen(@-I$1..@0$1) == 1 || "$1" == "nan", string(""), > rev(@-I$1..@0$1)); E > > |-------+----------------------------------------------------| > | value | difference | > |-------+----------------------------------------------------| > | 12 | | > | 15 | [0, 0] | > | | | > | 83 | [0, nan, 0, 0] | > | | | > | | | > | | | > | 87 | [0, nan, nan, nan, 0, nan, 0, 0] | > | | | > | | | > | | | > | 85 | [0, nan, nan, nan, 0, nan, nan, nan, 0, nan, 0, 0] | > | | | > |-------+----------------------------------------------------| > #+TBLFM: $2 = if(vlen(@-I$1..@0$1) == 1 || "$1" == "nan", string(""), > 0 * rev(@-I$1..@0$1)); E > > Distance to previous element: > > |-------+------------| > | value | difference | > |-------+------------| > | 12 | | > | 15 | 1 | > | | | > | 83 | 2 | > | | | > | | | > | | | > | 87 | 4 | > | | | > | | | > | | | > | 85 | 4 | > | | | > |-------+------------| > #+TBLFM: $2 = if(vlen(@-I$1..@0$1) == 1 || "$1" == "nan", string(""), > find(0 * rev(@-I$1..@0$1), 0, 2) - 1); E > > Previous element: > > |-------+------------| > | value | difference | > |-------+------------| > | 12 | | > | 15 | 12 | > | | | > | 83 | 15 | > | | | > | | | > | | | > | 87 | 83 | > | | | > | | | > | | | > | 85 | 87 | > | | | > |-------+------------| > #+TBLFM: $2 = if(vlen(@-I$1..@0$1) == 1 || "$1" == "nan", string(""), > subscr(rev(@-I$1..@0$1), find(0 * rev(@-I$1..@0$1), 0, 2)); E > > Combined: > > |-------+------------| > | value | difference | > |-------+------------| > | 12 | | > | 15 | 3 | > | | | > | 83 | 34 | > | | | > | | | > | | | > | 87 | 1 | > | | | > | | | > | | | > | 85 | -0.5 | > | | | > |-------+------------| > #+TBLFM: $2 = if(vlen(@-I$1..@0$1) == 1 || "$1" == "nan", string(""), > ($1 - subscr(rev(@-I$1..@0$1), find(0 * rev(@-I$1..@0$1), 0, 2))) / > (find(0 * rev(@-I$1..@0$1), 0, 2) - 1)); E > ​ ​Looks very interesting. I have to evaluate this. > For many here on the list it would probably be easier and more > interesting to write a TBLFM in Lisp. > ​I will look into that later. Would it then also be possible to fill several fields at the same time? At the moment I use the same checks for several fields. That is not really DRY. -- Cecil Westerhof