1

以下是我的 R 脚本的一部分:

for (i in 1:N-1) {
  if (-50<nw.bank[i] && 50>nw.bank[i]) {
      rl[i+1] <- (rl[i]+0.001)
  } 
    else {
      rl[i+1] <- rl[i]
  }
}

运行时,我收到以下消息:

"Error in if (-50 < nw.bank[i] && 50 > nw.bank[i]) { : 
  missing value where TRUE/FALSE needed"

谁能帮我吗?太感谢了!

最好的,贤

4

3 回答 3

5

请注意,它1:N-1被解析为(1:N) - 1. 这意味着您的循环正在迭代 0, 1, 2, ... (N - 1),并且使用的测试nw.bank[i]将在第一次迭代时出错。你可能的意思是1:(N - 1)

于 2013-07-03T05:34:05.297 回答
0

如果这不是1:N-1Hong 建议的问题,则尝试查找using中是否存在NA,并使用而不是,除非您有充分的理由(请参阅R - 布尔运算符 && 和 ||)。nw.bankany(is.na(nw.bank))&&&

于 2013-07-03T07:09:39.740 回答
0

与直接处理向量的代码相比,R for 循环的运行速度较慢。

你给出的这个过程可以向量化如下:

为 nw.bank 获取一些随机值,以便演示计算:

nw.bank<- 200*runif(20)-100 

[1]  43.273799  19.051499  37.552510  76.940632 -59.176684 -27.379326
[7] -37.512520  77.776610  88.127792 -91.213580 -50.691943  78.697820
[13]  36.933503 -76.973450  28.143336 -55.136574 -70.693362 -14.213375
[19]  15.666707  -3.072321

请注意,向量化的 AND 中只有一个与号 (&)

as.numeric(((-50<nw.bank) & (50>nw.bank)))
   [1] 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 1

现在乘以 0.001 并取累积和

   cumsum(0.001*as.numeric(((-50<nw.bank) & (50>nw.bank))))

[1] 0.001 0.002 0.003 0.003 0.003 0.004 0.005 0.005 0.005 0.005 0.005 0.005
[13] 0.006 0.006 0.007 0.007 0.007 0.008 0.009 0.010

现在你可能需要一个可调整的初始值,你就完成了

rlinit <- 3.0; 
rl <- cumsum(0.001*as.numeric(((-50<nw.bank) & (50>nw.bank)))) + rlinit



[1] 3.001 3.002 3.003 3.003 3.003 3.004 3.005 3.005 3.005 3.005 3.005 3.005
[13] 3.006 3.006 3.007 3.007 3.007 3.008 3.009 3.010
于 2013-07-03T05:44:25.633 回答