分组大小的指数平滑函数问题

时间:2016-04-09 02:07:49

标签: r

我遇到一个问题,我有一个计算指数平滑的函数,在一个字段上有一个基于组的滞后:

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 个答案:

答案 0 :(得分: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)]))
  }
}