2016-04-09 47 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)])) 
    } 
}