我正在尝试在r中创建一个指数平滑函数。
我已经能够使用公式在Excel中创建我需要的东西:
=(alpha*observed+(alpha - 1)*previous)
这很容易被拖下来并达到预期的效果。以下是alpha = 0.1的示例。
Score <- c(4,7,3,5,7,2,3)
Score Exp Smooth Calculation
4 #N/A #N/A
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
我确信必须有一种方法可以将此作为r中的函数重新创建。 此外,我需要此功能才能在多个字段上进行分组。这是另一个包含更多字段和所需指数平滑数字的示例。
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)
期望的结果:
Player Team Score Exp Smooth
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
我确信必须有办法在r中实现这一目标。任何帮助将不胜感激!
答案 0 :(得分:2)
您可以使用filter
功能。但是,我们必须有点创意,因为它的递归过滤器意味着滞后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)])
}
Score <- c(4,7,3,5,7,2,3)
fun(Score)
#[1] NA 4.00000 4.30000 4.17000 4.25300 4.52770 4.27493
Stack Overflow上有大量答案显示如何按组应用功能(&#34; split-apply-combine&#34;)。