使用dplyr迭代计算指数加权移动平均值

时间:2016-08-31 22:42:51

标签: r

我有一张表格如下:

json_encode

我想用cat1和cat2来计算指数加权移动平均线。

使用初始值零,这可能是:

  cat1 cat2         d
1    A    C 0.6445386
2    B    D 0.1831454
3    A    C 0.5093117
4    A    D 0.3516816
5    B    C 0.2547064
6    A    D 0.3209060

但这会返回错误:

table %>% 
          group_by(cat1,cat2) %>% 
          arrange(cat1,cat2) %>% 
          mutate(ema = (1-lambda)*ema+lambda*lag(ema,1,default=0)

我该如何解决这个问题?是否无法使用dplyr引用先前的迭代?

1 个答案:

答案 0 :(得分:0)

第一次引用ema时未初始化,因此没有名为ema的对象

你的代码中的

mutate( ema =(1-lambda)* ema + lambda * lag(ema,1,默认= 0)

粗体ema是自引用的,可能你正在寻找的公式是:(1-lambda)*d + lambda*lag(ema),所以我在解决方案中使用了这个

library(dplyr)
table <- data.frame(cat1 = c("A","B","A","A","B","A"),
                    cat2 = c("C","D","C","D","C","D"),
                    d = c(0.1831454, 0.5093117, 0.3516816 ,0.2547064 ,0.3209060,0.6445386))

lambda <- 0.55
table$ema <- NA
table$ema[1] <- table$d[1]

table %>% 
  group_by(cat1,cat2) %>% 
  arrange(cat1,cat2)

for(i in (2:dim(table)[1])){
  table$ema[i] <- table$d[i]*(1-lambda) + lambda*(table$ema[i-1])
}

这就是你要找的东西吗?

编辑:更改了代码