【发布时间】:2017-01-08 21:44:54
【问题描述】:
我想以运行总计的方式对向量/矩阵执行函数。
简单地说
perform the function for each row
from the first row up and including the current one
我找到了运行总计的各种解决方案,基本上是用 cumsum 函数。cumsum1dplyrcumsum2
但是 mean 函数已经没有按照我寻找的方式工作。而且 rle 也只适用于整个向量。
例子
> df <- data.frame(value = df <- data.frame(value = c(1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1)))
> df$csum <- ave(df$value, FUN=cumsum)
> df$mean <- ave(df$value, FUN=mean)
> df
value csum mean
1 1 1 0.45
2 0 1 0.45
3 0 1 0.45
4 1 2 0.45
5 0 2 0.45
6 0 2 0.45
7 0 2 0.45
8 0 2 0.45
9 0 2 0.45
10 0 2 0.45
11 1 3 0.45
12 1 4 0.45
13 0 4 0.45
14 1 5 0.45
15 0 5 0.45
16 1 6 0.45
17 1 7 0.45
18 0 7 0.45
19 1 8 0.45
20 1 9 0.45
但我想得到:
value csum mean run_mean
1 1 1 0.45 1
2 0 1 0.45 0,5
3 0 1 0.45 0,333333333
4 1 2 0.45 0,5
5 0 2 0.45 0,4
6 0 2 0.45 0,333333333
7 0 2 0.45 0,285714286
8 0 2 0.45 0,25
9 0 2 0.45 0,222222222
10 0 2 0.45 0,2
11 1 3 0.45 0,272727273
12 1 4 0.45 0,333333333
13 0 4 0.45 0,307692308
14 1 5 0.45 0,357142857
15 0 5 0.45 0,333333333
16 1 6 0.45 0,375
17 1 7 0.45 0,411764706
18 0 7 0.45 0,388888889
19 1 8 0.45 0,421052632
20 1 9 0.45 0,45
现在我知道我可以使用cumsum 和除法来解决均值挑战。但我想要一个通用的方法来解决类似rle
> df$rle <- ave(df$value, FUN=rle)
> df
value csum mean rle
1 1 1 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
2 0 1 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
3 0 1 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
4 1 2 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
5 0 2 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
6 0 2 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
7 0 2 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
8 0 2 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
9 0 2 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
10 0 2 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
11 1 3 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
12 1 4 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
13 0 4 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
14 1 5 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
15 0 5 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
16 1 6 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
17 1 7 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
18 0 7 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
19 1 8 0.45 1, 2, 1, 6, 2, 1, 1, 1, 2, 1, 2
20 1 9 0.45 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
>
对新手有什么建议吗?
编辑:使示例可重现(常量而不是 sample)
【问题讨论】:
-
不确定 ave 调用应该做什么:它们用于不相交的类别,它们需要三个参数:对于请求的运行均值函数为什么不。
function(x) {cumsum(x)/(1:length(x) )} -
注意:请使用
set.seed,以便我们根据您的预期输出检查我们的结果 -
@42:这就是我的意思,我知道我可以通过除法计算平均值。但这不是我所追求的。
-
澄清:我追求的是通用函数,而不是
mean的解决方案。请参阅并采取rle示例 -
根据你想要做什么,你可以用累积的方式来制定计算,这样 f(1:(n+1)) = F(f(1:n), n+ 1) 然后简单地使用 apply 系列中的一个函数来应用 F.
标签: r