R:如何(有效地)参数化和绘制(条件)函数?

时间:2014-03-05 11:39:11

标签: r ggplot2 conditional-statements parameterization

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

我最初考虑使用curve()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)

1 个答案:

答案 0 :(得分: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
  )
)