2017-11-21 16 views
0

私は今このサイトでかなりの時間を探していて、私の質問に対する答えを見つけることができませんでした。2つのif文で不完全なforループ

私は1つのデータフレーム(PEQTfXS_GrooteMolenbeek)ですべて集められた川のいくつかの特性の間の相関を研究しています。現時点では、私はこの川の排出量(PEQTfXS_GrooteMolenbeen $ Q)に集中しています。私がしたいことは、放電データを通してforループを実行し、現在の値が前の値よりも小さい場合は赤を割り当てます。現在の値が前の値より大きい場合、青色が割り当てられます。最後に、可能であれば、時間に対する赤と青のデータポイントのプロットを作成したい(PEQTfXS_GrooteMolenbeek $ date)。次のように

私が今持っているループは次のとおりです。

for (i in 1:length(PEQTfXS_GrooteMolenbeek$Q){ 
if PEQTfXS_GrooteMolenbeek$Q[i] < PEQTfXS_GrooteMolenbeek$Q[i-1] col = "red" 
if PEQTfXS_GrooteMolenbeek$Q[i] > PEQTfXS_GrooteMolenbeek$Q[i-1] col = "blue" 
} 

あり、このループから抜けているいくつかのことのように見えるが、私は何を知りません。それに加えて、私は私の質問のプロット部分をどのように実装できるのだろうかと思っています。

うまくいけば、この質問はあまりにも愚かではありません。私はforループよりも簡単な方法があることを知っていますが、私はそれらに興味がありません;)

ありがとう!

答えて

2

私はMilan Valášekの方がいいですが、より洗練されたRスタイルなので、forループとif文の構文に関する質問の部分をカバーする答えを提供したいと思います。再現可能な例がないので、いくつかの例示的なデータを使用しました。私はこれが構文の面で役立つことを願っています。

#generate example data 
#since your values are integers and your colour codes are characters 
#you need separate columns to store them 
#character vectors would not be allowed in an integer vector 
#(of course you could turn the full vector to character, 
#but this would be make the code unnecessarily complex) 
values <- rep(c(1,2), 5) 
value_color <- rep("", length(values)) 
df <- data.frame(values = values 
       , value_color = value_color 
       , stringsAsFactors = F) 

#since you index i-1, the first entry needs to be decided manually 
df[1, "value_color"] <- "red" 

#first entry skipped due to manual assignment 
#note the brackets around the definition of the loop indices 
for (i in 2:length(values)) { 

    #note the brackets around the definition of the expression to 
    #be checked via if 
    #best practice is to use curly brackets and new line to open if statements 
    #for better readability 
    #the if statements checks the values in the numeric column called value... 
    if (df[i, "values"] < df[i-1, "values"]) { 

    #...and assigns the corresponding value in the character column 
    df[i, "value_color"] <- "red" 

    } else if (df[i, "values"] > df[i-1, "values"]) { 

    df[i, "value_color"] <- "blue" 

    } 
} 

df 

#  values value_color 
# 1  1   red 
# 2  2  blue 
# 3  1   red 
# 4  2  blue 
# 5  1   red 
# 6  2  blue 
# 7  1   red 
# 8  2  blue 
# 9  1   red 
# 10  2  blue 
+0

あなたが言ったように、それをする方法ではなく、うまく "for/if'を示しました。たぶん追加の教訓的な価値のためのコードを注釈しますか? –

+0

良いアイデアは、後で私の休憩中にそれを行います... –

+1

...コードに注釈をつけて、それがあなたの教訓的な品質テストに合格することを願ってください;-) –

2

だけ例えば、あなたの状態のための要因変数のコードを作成します。

PEQTfXS_GrooteMolenbeek$group <- NA 
PEQTfXS_GrooteMolenbeek$group[-1] <- PEQTfXS_GrooteMolenbeek$Q[-1] > PEQTfXS_GrooteMolenbeek$Q[-nrow(EQTfXS_GrooteMolenbeek)] 
PEQTfXS_GrooteMolenbeek$group <- as.factor(PEQTfXS_GrooteMolenbeek$group) 

(上記のコードでは値が等しい場合には規定がありません上記のコードはでこれらの例を置きます。最初のグループ)

次に、あなただけの例えば、ベースplot()またはggplot2パッケージを使用してグラフを作成して、異なる色をコードするgroup変数を使用することができます。次のようなものがあります。

library(ggplot2) 
qplot(date, Q, color = group, data = PEQTfXS_GrooteMolenbeek) 

希望します。

+1

いいえ解決策、1つの小さな誤植は、nrowの閉じ括弧を追加してください... –

+1

ありがとう! –

関連する問題