2016-04-09 46 views
1

我有一个问题与函数指数平滑功能的问题,我有一个计算与一个以上组的一个字段一个滞后指数平滑:与分组大小

expsmo <- function(x) {res <- stats::filter(x * c(1, rep(0.1, length(x) - 1)), 0.9, method = "recursive") 
c(head(x,1), res[-length(res)])} 

这里是做什么的一个例子:

Score Exp Smooth  Calculation 
4  4    head(x,1) 
7  4    4 
3  4.3    0.1*7+0.9*4 
5  4.17   0.1*3+0.9*4.3 
7  4.253   0.1*5+0.9*4.17 
2  4.5277   0.1*7+0.9*4.253 
3  4.27493   0.1*2+0.9*4.5277 

问题是,当我通过组运行这个问题时,我得到一个小组的问题。 这里是变组大小的数据集:

Player <- c('A','B','B','C','C','C','D','D','D','D','E','E','E','E','E','F','F','F','F','F','F','G','G','G','G','G','G','G') 
Team <- c('A','B','B','C','C','C','D','D','D','D','E','E','E','E','E','F','F','F','F','F','F','G','G','G','G','G','G','G') 
Score <- c(5,2,7,3,9,6,3,7,1,7,3,8,3,4,1,9,4,6,3,8,3,4,1,9,4,6,6,4) 

当我跑过来的球员和团队分组的得分字段的功能:

ave(Score, Player, Team, FUN = expsmo) 

我刚刚得到的错误。

这是我与expsmo领域所需的输出:

Player Team Score expsmo 
A  A  5  5 
B  B  2  2 
B  B  7  2 
C  C  3  3 
C  C  9  3 
C  C  6  3.6 
D  D  3  3 
D  D  7  3 
D  D  1  3.4 
D  D  7  3.16 
E  E  3  3 
E  E  8  3 
E  E  3  3.5 
E  E  4  3.45 
E  E  1  3.505 
F  F  9  9 
F  F  4  9 
F  F  6  8.5 
F  F  3  8.25 
F  F  8  7.725 
F  F  3  7.7525 
G  G  4  4 
G  G  1  4 
G  G  9  3.7 
G  G  4  4.23 
G  G  6  4.207 
G  G  6  4.3863 
G  G  4  4.54767 

我敢肯定有修改功能做到这一点的方式。请帮忙!!!

回答

1

我认为ave()背后发生的事情是该函数检查组变量的每个组合,对于您的情况,某些组合没有任何数据,例如Player = "A", Team = "C",因此x的长度将为零,并且您的在这种情况下代码会中断,因为rep(0.1, -1)是无效的,所以添加一个长度检查器将解决问题。

expsmo <- function(x) { 
    if(length(x) != 0){ 
    res <- stats::filter(x * c(1, rep(0.1, (length(x) - 1))), 0.9, method = "recursive") 
    return(c(x[1], res[-length(res)])) 
    } 
}