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

ベクトルを直接処理するコードと比較すると、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 にはアンパサンド (&) が 1 つしかないことに注意してください。

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 に答える
0

1:N-1Hong が提案したように問題がない場合は、正当な理由がない限りNAnw.bankusingに問題があるかどうかを確認し、代わりにany(is.na(nw.bank))使用してください ( R - ブール演算子 && および ||を参照)。&&&

于 2013-07-03T07:09:39.740 に答える