我正在使用 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, dots) 中的错误:评估错误:n = 10 超出有效范围:[1, 7]。
当设置 n = 2 时:
mutate_impl(.data, dots) 中的错误:评估错误:n = 2 超出有效范围:[1, 1]。
有趣的是,如果我设置了代码,我可以成功运行代码,n = nrow(list[[i]])
但是这会妨碍我指定任何其他n
值的能力- 它是n = 1
或n = nrow(list)
。
这让我感到困惑,因为我在使用该rollmean
函数运行相同的 for 循环时没有任何问题,无论周期数 (k) 是多少。此外,我在单个数据帧上运行相同的功能没有问题:
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]
第一个线索应该是当我设置时 for 循环工作的事实n=nrow(list[[i]])
我现在的问题是如何设置 for 循环,使其在循环遍历数据帧时不会停止,nrows < n
或者更好,它会根据数据帧中的行数计算第一个可用的 EMA 值。
尝试用数字或行数中最小的一个来替换数字,例如:
mutate(exp.ma = EMA(val2, n = min(c(5,length(val2)))))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句