2017-11-01 3 views
0

条件付きで縦線を折れ線グラフにプロットしようとしています。私はベースのRグラフィックスで作業しています。
データを取り出すデータフレームはRW1と呼ばれ、同じプロットの2つのy軸にRW1の2つの変数をプロットしました。 2718の観測があります。
ここでは、 "RW1 $ Measured_CH1_CTT"の標準偏差に依存する垂直に配置された灰色の影付きバーを追加したいと思います。この変数は、左のy軸(側面2)にプロットされます。すなわち、連続する8回の観測における標準偏差が0.5以下である場合には、これらの観測値に対して垂直バーをプロットしなければならない。
私はこれをforループと組み込みのif文で記述しようとしていますが、少し苦労しています。これまでに私が得たものがここにあります。Rプロット - ネストされたforループを含む垂直に網掛けされたバー

# Set values outside loop 
xi <- 0 
xj <- 0 
n <- nrow(RW1) 

# Run the loop 
for (i in 1:n) { 
    for (j in min(i+8, n-i)) 
    Measured_CH1_CTT = RW1$Measured_CH1_CTT[i:(i+j)] 

    if (sd(Measured_CH1_CTT <= 0.5)) { 
     xi <- i 
     xj <- j 
     rect(xleft = xi, xright = xj, ybottom = -0.6, ytop = 0.6, density = 100, col = "grey") 
    } 
} 

臨界点は

  • 各区間(j)の終点のdefintionあります。 jは各出発点iからの8回の観測でなければならないが、私は8回の観測が長い間隔で「nの上のヒント」を防止しなければならない。これは、n = 2718-7 = 2711
  • のxleftとxrightの定義で、それぞれの間隔の開始点と終了点の定義で、 "Measured_CH1_CTT"のequalのif条件を満たすifが関心事になります0.5文以下にする。
  • if文。 Rは私に "引数は論理的であると解釈できません"というエラーを表示します。
  • ytopとybottom:2つあるのでy軸を指定しますか?私はちょうどそれが左のもの(サイド2)であり、その軸の範囲を示していると推測していた。

何か提案のために乾杯!

EDIT:変数に欠損値があるため、parantheses内にna.rm引数を指定し、 'lower than equal to'式を正しく配置しました:if (sd(Measured_CH1_CTT, na.rm = TRUE) <= 0.5)。 if文の別のエラーはmissing value where TRUE/FALSE neededになります。
要点は、間隔の定義やxixjの割り当てのどこかにある必要があります。私はif()の機能を(別の簡単な表現で)独立して実行しています。同様に、rect()関数は、手動でxleftxrightを指定すると機能します。

+0

ifステートメントでかっこが間違っているようです。私はあなたが 'if(sd(Measured_CH1_CTT)<= 0.5)'を望んでいると思う。 – G5W

+0

ええ、ほんの数秒前に気付いた。それを実行しようとしましたが、Rは私に別のエラー "TRUE/FALSEが必要なところに値がありません"を返します –

+0

多分else文を指定する必要があります。 if条件が満たされない場合は、ループを放棄します。 'else {next} 'でそれをしましたが、私はまだ' TRUE/FALSE needed'が必要な 'missing value'という同じエラーを受け取ります –

答えて

0

さて、私はしばらく時間がかかりましたが、何か助けを借りてそれを理解しました。一般的な問題は、ijの間隔の定義です。ネストされたループは必要ありません。 rect()関数は、すでに想定していたとおり正しく指定されました。 if()ステートメントに!is.na(sd_temp)を追加しなければなりませんでした。

正しい構文は、次の(より一般的な理解に調整名)のようになります。

# Add vertical shaded bars 
n <- nrow(df) - 7 
for (i in 1:n) { 
    j = i + 7 
    y_temp = df$y[i:j] 

    sd_temp <- sd(y_temp, na.rm = TRUE) 
    if (!is.na(sd_temp) & sd_temp <= 0.5) { 
    rect(xleft = i, xright = j, ybottom = min.length_y, ytop = max.length_y, density = NA, col = "gray94") 
    } else { 
    next 
    } 
} 

は多分これは他の誰かに助けています。

警告:一般的にループはいくぶん遅いですが、このループでは2700回の反復しかできませんでしたが、処理は非常に遅かったため、20分後に中止しなければなりませんでした。この場合のように、ループが描画関数と組み合わされたとき、Rの苦闘はさらに増えていると思います。

関連する問題