【发布时间】:2018-12-06 23:23:20
【问题描述】:
我正在使用 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)。
这让我感到困惑,因为无论句点 (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 值一个数据框。
【问题讨论】:
-
嗨。你能用编程语言标记你的问题吗?你一定会以这种方式获得更好的观众。我不知道它是什么语言。可能看起来像 Python?
-
在我匆忙发布时,我忘记在标题中包含 R 并相应地标记它。感谢您接受这一点,科多斯。
-
尝试在
list[[i]] <- list[[i]]中将赋值运算符更改为“=”,即使用list[[i]] = list[[i]] -
@AkarshJain: 使用
=给了我同样的错误。 -
@On_an_island 给出可重现的玩具示例以产生相同的错误。