如何在不使用循环的情况下计算R中的“连续均值”,或者以更有效的方式计算?

时间:2010-08-09 03:35:19

标签: optimization r loops

我有一组数据,我需要计算他们的“连续均值”(我不知道如果它是正确的名称,但我找不到更好的东西),这是一个例子:

ID  Var2 Var3    
1    A    1
2    A    3
3    A    5
4    A    7
5    A    9
6    A    11
7    B    2
8    B    4
9    B    6
10   B    8
11   B    10

这里我需要连续计算同一子集中3个Var3变量的平均值(即有4个意味着为A计算:平均值(1,3,5),平均值(3,5,7),平均值( 5,7,9),平均值(7,9,11)和3表示B的平均值:平均值(2,4,6),平均值(4,6,8),平均值(6,8,10)。结果应该是:

ID  Var2 Var3 Mean
1    A    1   N/A
2    A    3   N/A
3    A    5   3
4    A    7   5
5    A    9   7
6    A    11  9
7    B    2   N/A
8    B    4   N/A
9    B    6   4
10   B    8   6
11   B    10  8

目前我正在使用“循环内循环”方法,我使用Var2对数据集进行子集化,然后我从第三个数据开始计算另一个起点的平均值。

它适合我需要的东西,但它很慢,有没有更快的方法解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:3)

它通常被称为“滚动平均值”或“运行平均值”。 plyr包允许您计算数据段的函数,zoo包具有滚动计算的方法。

> lines <- "ID,Var2,Var3    
+ 1,A,1
+ 2,A,3
+ 3,A,5
+ 4,A,7
+ 5,A,9
+ 6,A,11
+ 7,B,2
+ 8,B,4
+ 9,B,6
+ 10,B,8
+ 11,B,10"
> 
> x <- read.csv(con <- textConnection(lines))
> close(con)
> 
> ddply(x,"Var2",function(y) data.frame(y,
+   mean=rollmean(y$Var3,3,na.pad=TRUE,align="right")))
   ID Var2 Var3 mean
1   1    A    1   NA
2   2    A    3   NA
3   3    A    5    3
4   4    A    7    5
5   5    A    9    7
6   6    A   11    9
7   7    B    2   NA
8   8    B    4   NA
9   9    B    6    4
10 10    B    8    6
11 11    B   10    8

答案 1 :(得分:3)

或者使用基础R

x$mean <- unlist(tapply(x$Var3, x$Var2, zoo::rollmean, k=3, na.pad=TRUE, align="right", simplity=FALSE))