【问题标题】:Nested for-loops into apply?嵌套for循环到应用?
【发布时间】:2019-01-17 09:08:48
【问题描述】:

我需要帮助来弄清楚如何改进 for 循环。不一定非要apply,我只是觉得这是在StackOverflow上研究后最好的方法。我尝试按照在 StackOverflow 上找到的指南进行操作,但我是新手,我相信我对 apply 函数没有很好的掌握。

这是对我正在尝试更改的 sn-p 的重构:

for (j in 1:NROW(teste2) {
  for (z in 1:NROW(teste2)) {
        if(is.na(teste2$DATE[z]==Sys.Date()+j-1) | z==NROW(teste2)){
          teste2$SALDO[z] <- 0
        }else{
            if(teste2$SALDO[z]!=0 & teste2$DATE[z]==Sys.Date()+j-1){
              teste2$SALDO[z+1] <- teste2$PREVISAO_FINAL2[z] + teste2$SALDO[z+1]
          }else{
            teste2$SALDO[z] <- teste2$SALDO[z]
          }
        }
}

我尝试了以下操作:

for (j in 1:NROW(teste2) {
  rows = 1:NROW(teste2)
  saldo_fn <- function(z){
    return(if(is.na(teste2$DATE[z]==Sys.Date()+j-1) | z==NROW(teste2)){
      teste2$SALDO[z] <- 0
    }else{
      if(teste2$SALDO[z]!=0 & teste2$DATE[z]==Sys.Date()+j-1){
        teste2$SALDO[z+1] <- teste2$PREVISAO_FINAL2[z] + teste2$SALDO[z+1]
      }else{
        teste2$SALDO[z] <- teste2$SALDO[z]
      }
    })
}
teste2$SALDO <- sapply(rows, saldo_fn)
}

但是当我运行 sum(teste2$SALDO) 时,它给出了不同的值。

我做错了什么?我该如何解决?

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。这样可以更轻松地为您提供帮助。

标签: r for-loop apply sapply


【解决方案1】:

您不能使用apply-family 函数来优化算法。原因是一行:

teste2$SALDO[z+1] <- teste2$PREVISAO_FINAL2[z] + teste2$SALDO[z+1]

您正在根据当前元素的值递归地更改下一个元素的值。

可以通过使用递归来避免for-loop,即如果你看到类似x[i+1] = x[i+1] + x[i]的东西,你应该使用for-loops或递归函数(我更喜欢for-loops,它们更容易并且调用堆栈溢出没有问题),如果你看到类似z[i] = F(x[i], y[i])的东西,其中F是一些函数,你可以使用apply-family函数。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2021-07-08
    • 2012-06-27
    • 2016-05-07
    相关资源
    最近更新 更多