如何计算一个向量中的累进平均数,但当条件满足时重新开始?

问题描述 投票:0回答:1

给出以下向量

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)

谢谢你

r mean
1个回答
0
投票

您可以使用 cumsum(abs(diff(x)) > 1.3)) 来定义组,这些组被用于 aggregate 重新启动 cumsum(x)/seq_along(x) 每次当差值大于1.3或小于-1.3时。

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

0
投票

也许你可以试试 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
© www.soinside.com 2019 - 2024. All rights reserved.