我有一个data.frame,每行包含一个函数的参数值(即每行一个函数)。我想绘制这些功能。这些函数是有条件的,并且只应针对某些值绘制,并且具有扭结(由于最小/最大级别)。请参阅我要归档的示例:
我最初考虑使用curve()
或stat_function
(ggplot2-library)。但我看不出如何仅为某些值绘制曲线(参见a,b,c),而不生成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)
答案 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
)
)