一个数组中,如何按照连续相同的数据进行分组计算?

v=[10,15,20,20,30,30,30,50,50,75];
v_final=[10,15,20,25,30,35,40,50,55,75];

想把v转换成v_final的样子。在DolphinDB database中试了下面代码:

diff=eachPre(-,v,0);
v1=v + iif(diff>0, 0, 5);

得到v1为[10,15,20,25,30,35,35,50,55,75],但v1这样还不行,请问怎样弄下?就是要把diff=0的部分累加5而不是直接加5,好像应该和accumulate结合起来用,但不知该怎样结合?

阅读 2.5k
2 个回答

可以用segmentby函数来实现:

v=[10,15,20,20,30,30,30,50,50,75];
step = 5
v1 = iif(nullFill(deltas(v),v)>0,0,1)
v_final =  v + segmentby(accumulate{add}, v1, v1) * step

最简单最高效的办法应该是使用cumPositiveStreak函数。连续的positive的数会累加,遇到0或负数置0

v=[10,15,20,20,30,30,30,50,50,75]
eachPre(eq, v).cumPositiveStreak() * 5 + v

segmentby是解决连续相同的数据分组计算的通用办法。

segmentby(x->x + seq(0, x.size() - 1) * 5, v, v)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进