1

我有一个data.frame,每一行都包含一个函数的参数值(即每行一个函数)。我想画出这些函数。这些函数是有条件的,应该只针对某些值绘制,并且有扭结(由于最小/最大级别)。请参阅我要存档的示例: 条件函数

我最初考虑使用curve()or stat_function(ggplot2-library)。但我看不出如何仅针对某些值(参见abc)绘制曲线,而不生成 data.frame。

所以我创建了一个生成绘图数据的函数:

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 回答