我正在使用TTR包来计算大量数据帧上的指数移动平均值。当我尝试下面的for循环时,如果我设置n> 1,则会收到评估错误。
options(digits = 3)
for(i in seq_along(list)){
list[[i]] <- list[[i]] %>%
mutate(exp.ma = EMA(x, n = 10))
}
mutate_impl(.data,点)中的错误: 评估错误:n = 10超出有效范围:[1,7]。
设置n = 2时:
mutate_impl(.data,点)中的错误: 评估错误:n = 2超出有效范围:[1,1]。
有趣的是,如果设置了n = nrow(list[[i]])
,我可以成功运行代码,但是这妨碍了我指定其他任何n
值的能力-它是n = 1
或n = nrow(list)
。 / p>
这让我感到困惑,因为无论使用多少周期(k),使用rollmean
函数运行相同的for循环都没有问题。另外,我在单个数据帧上运行相同功能没有问题:
df <- df %>% mutate(exp.ma = EMA(x, n = 10))
在我看来,此错误与在列表的长度上成功/失败地迭代i
有关。我敢肯定我的代码不是解决此问题的最有效方法,因此希望能获得任何指导。
编辑:可复制的示例
library(TTR)
library(tidyverse)
library(plyr)
# reproducible example
set.seed(1363)
d1 <- data.frame(val1 = c(rnorm(n=3, mean=15)), val2 = c(rnorm(n=3, mean=15)))
d2 <- data.frame(val1 = c(rnorm(n=35, mean=12)), val2 = c(rnorm(n=35, mean=25)))
my.list <- list(df1 = d1, df2 = d2)
for (i in seq_along(my.list)) {
my.list[[i]] <- my.list[[i]] %>%
mutate(exp.ma = EMA(val2, n = 5))
}
> Error in EMA(val2, n = 5) : n = 5 is outside valid range: [1, 3]
我弄清楚是什么原因引起的错误。列表(d1)中的第一个数据帧有3行,因此设置n = 5将产生n=5 is outside valid range: [1, 3]
。第一个线索应该是当我设置n=nrow(list[[i]])
时for循环起作用的事实。 >
我现在的问题是如何设置for循环,以使它在使用nrows < n
或更佳的数据帧循环时不会停止,它根据的数量计算第一个可用的EMA值。数据框中的行。
答案 0 :(得分:2)
尝试用数字或行数中的最小值选择数字,例如:
mutate(exp.ma = EMA(val2, n = min(c(5,length(val2)))))