特定值的累积平均值

Ker*_*rry 3 r cumulative-sum

我想仅在值> 0时计算累积平均值.如果我有一个矢量:

v <- c(1, 3, 0, 3, 2, 0)
Run Code Online (Sandbox Code Playgroud)

平均值是9/6 = 1.5,但是我只想在值> 0时取平均值,因此在这种情况下它将是9/4 = 2.25.但是这个平均值是整个集合.我希望在数据集构建和累积时进行平均.所以,最初它将是:

1+3/2, 1+3+0/2, 1+3+0+3/3, 1+3+0+3+2/4, 1+3+0+3+2+0/4
Run Code Online (Sandbox Code Playgroud)

我的数据集是9,000行,而且还在增长.我可以开始cumsum工作并计算累积总和,但不计算"成功"的累积平均值.

Jaa*_*aap 6

您可以通过将累积和除以v逻辑向量的累积和来解决此问题v > 0:

v1 <- cumsum(v)/cumsum(v>0)
Run Code Online (Sandbox Code Playgroud)

这使:

> v1
[1] 1.000000 2.000000 2.000000 2.333333 2.250000 2.250000
Run Code Online (Sandbox Code Playgroud)

如果要省略第一个值:

v2 <- (cumsum(v)/cumsum(v>0))[-1]
Run Code Online (Sandbox Code Playgroud)

这使:

> v2
[1] 2.000000 2.000000 2.333333 2.250000 2.250000
Run Code Online (Sandbox Code Playgroud)

后者等于问题中指定的期望结果:

> ref <- c((1+3)/2, (1+3+0)/2, (1+3+0+3)/3, (1+3+0+3+2)/4, (1+3+0+3+2+0)/4)
> identical(v2, ref)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

数据集中的实现:

# create an example dataset
df <- data.frame(rn = letters[seq_along(v)], v)

# calculate the 'succes-cummulative-mean'
library(dplyr)
df %>% 
  mutate(succes_cum_mean = cumsum(v)/cumsum(v>0))
Run Code Online (Sandbox Code Playgroud)

这使:

  rn v succes_cum_mean
1  a 1        1.000000
2  b 3        2.000000
3  c 0        2.000000
4  d 3        2.333333
5  e 2        2.250000
6  f 0        2.250000
Run Code Online (Sandbox Code Playgroud)