我有一个数据集:
Player <- c('Y','Z','Z','Z','Z','Y','Y','Y','Y','Z','Y','Y','Z','Y','Z','Y','Z','Z','Y','Y','Z','Y','Z','Y','Z','Z','Y')
Team <- c('A','B','A','A','B','A','B','B','A','A','B','B','A','A','A','A','A','A','A','B','B','B','B','A','A','A','A')
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)
data.frame(Player, Team, Score)
我有一个函数,使用alpha = 0.1执行指数平滑:
fun <- function(x) {
res <- stats::filter(x * c(1, rep(0.1, length(x) - 1)), 0.9, method = "recursive")
c(NA, res[-length(res)])}
然后我在不同的组上运行此功能。
EXP <- ave(Score, Player, Team, FUN = fun)
data.frame(Player, Team, Score, EXP)
给出:
Player Team Score EXP
Y A 5 #N/A
Z B 2 #N/A
Z A 7 #N/A
Z A 3 7
Z B 9 2
Y A 6 5
Y B 3 #N/A
Y B 7 3
Y A 1 5.1
Z A 7 6.6
Y B 3 3.4
Y B 8 3.36
Z A 3 6.64
Y A 4 4.69
Z A 1 6.276
Y A 9 4.621
Z A 4 5.7484
Z A 6 5.57356
Y A 3 5.05890
Y B 8 3.82400
Z B 3 2.70000
Y B 4 4.24160
Z B 1 2.73000
Y A 9 4.85301
Z A 4 5.616204
Z A 6 5.454584
Y A 6 5.267709
但是我有两个问题/要求:
我不想给每组的第一行提供NA,而是希望给出观察值x。
当一个分组只有一行时,我再次希望它能给出观察值x。
通过这两个修正案,这可以作为期望的结果(我在底部添加了一行子集):
Player Team Score Exp Smooth
Y A 5 5
Z B 2 2
Z A 7 7
Z A 3 7
Z B 9 2
Y A 6 5
Y B 3 3
Y B 7 3
Y A 1 5.1
Z A 7 6.6
Y B 3 3.4
Y B 8 3.36
Z A 3 6.64
Y A 4 4.69
Z A 1 6.276
Y A 9 4.621
Z A 4 5.7484
Z A 6 5.57356
Y A 3 5.05890
Y B 8 3.82400
Z B 3 2.70000
Y B 4 4.24160
Z B 1 2.73000
Y A 9 4.85301
Z A 4 5.616204
Z A 6 5.454584
Y A 6 5.267709
B B 4 4
有没有办法改变这个功能呢?任何帮助表示赞赏!