【问题标题】:ERROR in R.... missing value where TRUE/FALSE needed [duplicate]R中的错误......缺少需要TRUE / FALSE的值[重复]
【发布时间】:2013-07-03 05:26:35
【问题描述】:

以下是我的 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"

谁能帮帮我?非常感谢!

最好, 炫

【问题讨论】:

  • 我不知道 R 但尝试将每个表达式括在括号中:((-50 &lt; nw.bank[i]) &amp;&amp; (50 &gt; nw.bank[i])),可能!
  • 如果nw.bank[i]NA,你会得到一个错误。
  • 嗨 LostBrit,是的,你是对的。如果我使用 Ctrl+R 运行 if 语句,即 (-50nw.bank[i]),我得到的结果为:[1] NA。这很奇怪,因为 nw.bank 定义明确并且单独运行 nw.bank 会给出正确的结果。你知道出了什么问题吗?非常感谢您的帮助!

标签: r if-statement


【解决方案1】:

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

【讨论】:

  • 您好洪,非常感谢您的评论。它有帮助。但其他地方似乎也存在问题。如果我使用 Ctrl+R 运行 if 语句,即 (-50nw.bank[i]),我得到的结果为:[1] NA。这很奇怪,因为 nw.bank 定义明确并且单独运行 nw.bank 给出了正确的结果。你知道出了什么问题吗?感谢您的帮助!
【解决方案2】:

如果不是Hong建议的1:N-1的问题,那么尝试使用any(is.na(nw.bank))查找nw.bank中是否有NA,并使用&amp;而不是&amp;&amp;,除非你有一个好的原因(见R - boolean operators && and ||)。

【讨论】:

  • 嗨 Cogitovita,我试过 is.na,是的,有很多 NA。但是,来自 is.na 的结果和分别运行 nw.bank 的结果之间的 NA 数量是不同的。无论如何,我无法弄清楚为什么我会得到 NA。你能帮帮我吗?我真的很感激:)
  • 统计NAs的数量,我推荐使用sum(is.na(nw.bank))NAs 可以通过非流分析引入。
  • 我明白了。你能告诉我你所说的“非流式分析”是什么意思吗?我真的很感激!
  • 您如何获得nw.bank?你认为它可能包含NA吗?如果没有,您应该检查生成nw.bank 的代码,看看那里发生了什么。
【解决方案3】:

与直接处理向量的代码相比,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

【讨论】:

  • 嗨,保罗,非常感谢!但这是唯一的解决方案吗?如果我可以找到并修复我的脚本的任何逻辑错误,我想采用一种更简单的方法,因为我的脚本中有更多部分与我发布的部分相似。最好的,炫
  • 有多种方法可以做到这一点。使用对你有用的东西。我认为 2 行比 8 行简单,易于阅读,R 会运行得更快,但程序员编写也需要更长的时间,并且需要了解很多 R 函数。
  • 知道了!我会试试看。非常感谢您的帮助!
猜你喜欢
  • 2020-07-29
  • 2015-01-17
  • 2014-06-06
  • 1970-01-01
  • 2018-08-09
  • 2019-02-25
  • 2013-02-24
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多