【问题标题】:R - How to continue iteration when nrow < NR - 当nrow < N时如何继续迭代
【发布时间】: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 = 1n = nrow(list)

这让我感到困惑,因为无论句点 (k) 的数量如何,使用 rollmean 函数运行相同的 for 循环都没有问题。此外,我在单个数据帧上运行相同的功能没有问题:

df &lt;- df %&gt;% 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 &lt; n 或更好的数据帧循环时不会停止,它会根据行数计算第一个可用的 EMA 值一个数据框。

【问题讨论】:

  • 嗨。你能用编程语言标记你的问题吗?你一定会以这种方式获得更好的观众。我不知道它是什么语言。可能看起来像 Python?
  • 在我匆忙发布时,我忘记在标题中包含 R 并相应地标记它。感谢您接受这一点,科多斯。
  • 尝试在list[[i]] &lt;- list[[i]] 中将赋值运算符更改为“=”,即使用list[[i]] = list[[i]]
  • @AkarshJain: 使用 = 给了我同样的错误。
  • @On_an_island 给出可重现的玩具示例以产生相同的错误。

标签: r list for-loop iteration


【解决方案1】:

尝试用数字或行数中最小的一个来替换数字,例如:

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

【讨论】:

  • 正是我想要的。谢谢!一旦我有足够的声望点,我会确保 +1。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多