我遇到一个问题,我有一个计算指数平滑的函数,在一个字段上有一个基于组的滞后:
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
我确定有办法修改这个功能。请帮忙!!!
答案 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)]))
}
}