各行に関数のパラメーター値が含まれている data.frame があります (つまり、行ごとに 1 つの関数)。これらの関数を描きたいと思います。関数は条件付きで、特定の値に対してのみ描画する必要があり、キンクがあります (最小/最大レベルによる)。アーカイブしようとしているものの例を参照してください。
私はもともとcurve()
or stat_function
(ggplot2-library) の使用を検討していました。しかし、data.frame を生成せずに、特定の値 ( a 、 b 、 c を参照)に対してのみ曲線を描画する方法がわかりませんでした。
そこで、プロット データを生成する関数を作成しました。
N = 10000;
PrisstrukturToPlotdata = function(s){
# Create empty data.frame:
A <- data.frame(Site=rep(s$Site, N), bid=1:N, Saelger=rep(NA, N), Koeber=rep(NA, N), stringsAsFactors=FALSE)
# Fill out the data.frame:
for (i in 1:N) {
# Don't draw below:
if(i > s$Mindste_bud*s$Kurs) {
# First parenthesis is condition to insure we are above min, second parenthesis is in-between min and max, and third parenthesis is condition for above max:
A[i, ]$Saelger = s$Saelger_Fast_salaer*s$Kurs + i*s$Saelger_Andet_pct +
(i*s$Saelger_Variable_salaer <= s$Saelger_Min_variable_salaer*s$Kurs) *
s$Saelger_Min_variable_salaer*s$Kurs +
(i*s$Saelger_Variable_salaer > s$Saelger_Min_variable_salaer | (s$Saelger_Max_variable_salaer != 0 & i*s$Saelger_Variable_salaer < s$Saelger_Max_variable_salaer*s$Kurs)) *
i*s$Saelger_Variable_salaer
(s$Saelger_Max_variable_salaer != 0 & i*s$Saelger_Variable_salaer >= s$Saelger_Max_variable_salaer*s$Kurs) *
s$Saelger_Max_variable_salaer*s$Kurs;
A[i, ]$Koeber = s$Koeber_Fast_salaer*s$Kurs + i*s$Koeber_Variable_salaer;
}
}
return(A)
}
library(plyr)
Plotdata = adply(Prisstruktur, 1, PrisstrukturToPlotdata, .expand = FALSE)
条件の説明: 最小値があり、それ以下では曲線をまったく描画してはなりません。if(i > s$Mindste_bud*s$Kurs)
)。次に、それぞれ最小レベルと最大レベルのパーセンテージがありi*s$Saelger_Variable_salaer
ます (複雑にするために、すべての関数に最大値があるわけではありません。最大値のないものは0
. パーセンテージが最小値を下回る場合は、最小レベルを使用する必要があります。パーセンテージが最大値を超える場合は、最大レベルを使用する必要があります。間にパーセンテージを使用する必要があります。
上記のスクリプトは、N=100 または N=1000 でも問題なく動作しますが、N=10000 以上になると実行に時間がかかります。これはすべての条件ステートメントが原因だと推測していますが、より効率的な方法でこれを行う方法がわかりませんか?
ダミーデータ:
Site = c('A', 'B', 'C')
Mindste_bud = c(300, 0 , 0)
Saelger_Fast_salaer = c(0, 250, 2)
Saelger_Variable_salaer = c(0.12, 0.16, 0.10)
Saelger_Min_variable_salaer = c(250, 0, 0)
Saelger_Max_variable_salaer = c(0, 0, 250)
Saelger_Andet_pct = c(0, 0, 0)
Koeber_Fast_salaer = c(95, 0, 0)
Koeber_Variable_salaer = c(0.2, 0.25, 0)
Kurs = c(1, 1, 5.430)
Prisstruktur = cbind(Site, Mindste_bud, Saelger_Fast_salaer, Saelger_Variable_salaer, Saelger_Min_variable_salaer, Saelger_Max_variable_salaer, Saelger_Andet_pct, Koeber_Fast_salaer, Koeber_Variable_salaer, Kurs)