【问题标题】:If statement in R gives weird results如果 R 中的语句给出了奇怪的结果
【发布时间】:2020-11-21 23:14:23
【问题描述】:

我有一个包含 741 个值的时间序列,我试图在每个非重叠块中提取其中的最大值。在我的例子中,第一个块包含前 10 个值,第二个包含从第 11 个到第 20 个值,第三个从第 21 个到第 30 个,而最后一个块包含一个值,即第 741 个值。

数据的前三个值:

log_returns <- c(0, 0.00394232277373519, 0.0287804332171326, ...)

我的尝试:

block_maxima = c()
for (i in 1:741){if (i %% 10 == 0) {block_maxima <- c(block_maxima, max(log_returns[i-9: i]))
}}

这段代码给了我结果:

c(0, 0.0287804332171326, 0.0287804332171326, ...)

我想要:

c(0.0287804332171326, 0.0236378411885054, 0.0185381209989108, ...)

有人可以指出我在代码中犯的错误吗?提前致谢。

【问题讨论】:

  • 尝试将其包裹在(i-9)log_returns[(i-9): i]

标签: r for-loop if-statement


【解决方案1】:

我们可以将i-9 包裹在() 中以避免运算符优先级问题

block_maxima = c()
for (i in 1:741){
        if (i %% 10 == 0) {
     block_maxima <- c(block_maxima, max(log_returns[(i-9): i]))
   }
   }

【讨论】:

    【解决方案2】:

    查看您的代码,您似乎正在尝试一次获取 10 个值的 max。您可以创建每 10 个元素组成的组并在其中找到 max,而不是遍历每个元素然后对每 10 个元素执行计算。一种方法是使用tapply

    block_maxima  <- tapply(log_returns, ceiling(seq_along(log_returns)/10), max)
    

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2013-12-19
      相关资源
      最近更新 更多