1

各行に関数のパラメーター値が含まれている 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)
4

1 に答える 1

0

関数にループは必要ありません。素敵なプロットを得るために、すべての N = 10000 データ ポイントが必要だとは思えません。わかりやすくするために、より多くの空白といくつかの ifelse 関数を使用して、コードに構造を追加しました。

PrisstrukturToPlotdata <- function(s, N = 10000, Length = 101)
  n <- seq(s$Mindste_bud * s$Kurs + 1, N, length = Length)
  data.frame(
    Bid = n,
    Saelger = 
      s$Saelger_Fast_salaer * s$Kurs + 
      n * s$Saelger_Andet_pct +
      ifelse(
        n * s$Saelger_Variable_salaer <= s$Saelger_Min_variable_salaer * s$Kurs,
        s$Saelger_Min_variable_salaer * s$Kurs,
        0
      ) +
      ifelse(
        n * s$Saelger_Variable_salaer > s$Saelger_Min_variable_salaer | 
          (s$Saelger_Max_variable_salaer != 0 & 
             n * s$Saelger_Variable_salaer < s$Saelger_Max_variable_salaer * s$Kurs),
        n * s$Saelger_Variable_salaer,
        0
      ) +       
      ifelse(
        s$Saelger_Max_variable_salaer != 0 & n * s$Saelger_Variable_salaer >= s$Saelger_Max_variable_salaer * s$Kurs,
        s$Saelger_Max_variable_salaer * s$Kurs,
        0
      ),
    Koeber = s$Koeber_Fast_salaer * s$Kurs + n * s$Koeber_Variable_salaer
  )
)
于 2014-03-05T14:50:50.197 に答える