R-当nrow <N

时间:2018-06-28 01:11:11

标签: r list for-loop iteration

我正在使用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 = 1n = 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值。数据框中的行。

1 个答案:

答案 0 :(得分:2)

尝试用数字或行数中的最小值选择数字,例如:

mutate(exp.ma = EMA(val2, n = min(c(5,length(val2)))))