如何计算向量中的渐进平均值但在满足条件时重新启动?

Posted

技术标签:

【中文标题】如何计算向量中的渐进平均值但在满足条件时重新启动?【英文标题】:How to calcualte the progressive mean in a vector BUT restarting when a condition is met? 【发布时间】:2020-10-07 03:47:04 【问题描述】:

给出以下向量

x<-c(0,0,0,5.0,5.1,5.0,6.5,6.7,6.0,0,0,0,0,3.8,4.0,3.6)

我想要一个具有累积平均值的向量,比如

cumsum(x)/seq_along(x)

但每次两个后续值之间的差值大于 1.3 或小于 -1.3 时都会重新开始计算。我的目标是获得类似的向量

d<-c(0,0,0,5,5.05,5.03,6.5,6.6,6.37,0,0,0,0,3.8,3.9,3.8)

谢谢

【问题讨论】:

【参考方案1】:

您可以使用cumsum(abs(diff(x)) &gt; 1.3)) 定义组,在aggregate 中使用这些组,以在每次差值大于1.3 或小于-1.3 时重新启动cumsum(x)/seq_along(x)

unlist(aggregate(x, list(c(0, cumsum(abs(diff(x)) > 1.3))),
  function(x) cumsum(x)/seq_along(x))[,2])
# [1] 0.000000 0.000000 0.000000 5.000000 5.050000 5.033333 6.500000 6.600000
# [9] 6.400000 0.000000 0.000000 0.000000 0.000000 3.800000 3.900000 3.800000

【讨论】:

【参考方案2】:

也许你可以试试ave + findInterval 如下所示

ave(x,findInterval(seq_along(x),which(abs(diff(x))>1.3)+1),FUN = function(v) cumsum(v)/seq_along(v))

给了

 [1] 0.000000 0.000000 0.000000 5.000000 5.050000 5.033333 6.500000 6.600000   
 [9] 6.400000 0.000000 0.000000 0.000000 0.000000 3.800000 3.900000 3.800000

【讨论】:

以上是关于如何计算向量中的渐进平均值但在满足条件时重新启动?的主要内容,如果未能解决你的问题,请参考以下文章

仅当满足每行元素的条件时,才计算二维数组特定列的均值和方差

如何更改向量中元素的值?

当我在 C++ 中只有对向量的引用时如何更改向量中的对象

计算满足条件的列部分的平均值以创建新数据框

在 C++ 中满足某些条件(如果)后,如何重新启动 while 循环? [关闭]

计算另一个图像像素满足条件的像素值的平均值