以下是我的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"
任何人都可以帮助我吗?非常感谢你!
最好的, 炫
答案 0 :(得分:4)
请注意,1:N-1
被解析为(1:N) - 1
。这意味着你的循环迭代超过0,1,2,...(N - 1),并且使用nw.bank[i]
的测试将在第一次迭代时出错。你可能意味着1:(N - 1)
。
答案 1 :(得分: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
中只有一个&符号(&amp;)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 :(得分:0)
如果不是香港建议的1:N-1
问题,请尝试使用NA
查找nw.bank
中是否any(is.na(nw.bank))
,并使用&
除非你有充分的理由(见R - boolean operators && and ||)。
&&