Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ggplot2使用R绘制各种情况_R_Ggplot2 - Fatal编程技术网

使用ggplot2使用R绘制各种情况

使用ggplot2使用R绘制各种情况,r,ggplot2,R,Ggplot2,我正试图为我的公司设想健康保险福利选项,以帮助其他人做出决策。我有一张这样的桌子: | plan | ded | oop | exp_oop | |------+------------+------+---------| | a | 400 | 2100 | 17400 | | b | 1300 | 2600 | 14300 | | c | 2600 | 5200 | 28600 | ded=免赔额;90%

我正试图为我的公司设想健康保险福利选项,以帮助其他人做出决策。我有一张这样的桌子:

| plan |        ded |  oop | exp_oop |
|------+------------+------+---------|
|    a |        400 | 2100 | 17400   |
|    b |       1300 | 2600 | 14300   |
|    c |       2600 | 5200 | 28600   |
  • ded
    =免赔额;90%共同保险生效的费用水平
  • oop
    =自掏腰包的最大值
  • exp\u oop
    =达到
    oop
    的医疗费用金额
我想计算员工的成本与产生的医疗费用。健康保险的工作范围

cost = expenses for 0 < expenses < ded
cost = deductible + (0.10 x (expenses - ded)) for ded <= expenses < exp_oop
cost = oop for oop <= expenses <= infinity
我正在为几个变量(仅限员工、员工+配偶等)执行此操作,因此,如果我不需要为每个计划使用单独的数据表,但可以使用数据框中已定义的免赔额和自付最大值,这将是非常棒的


谢谢你的建议

编写一个向量化函数,将员工的成本计算为发生费用的函数。必须对其进行矢量化,以便您可以将其馈送到
ddply

costFinder <- function(df, oopActual) {
  #df is your 'dat'; we will throw away exp_oop
  #oopActual should be a vector; it is the x axis of your plot
  ded <- df$ded
  oopMax <- df$oop
  cost <- rep(NA, length(oopActual)) #preallocating with NAs will help ID mistakes
  cost[oopActual<ded] <- oopActual[oopActual<ded]
  cost[ded <= oopActual & oopActual < oopMax] <- 0.1 * (oopActual[ded <= oopActual & oopActual < oopMax] - ded) + ded
  cost[oopMax <= oopActual] <- oopMax
  return(cost)
}
现在融化向量,以便可以将其与
ggplot
一起使用。在这里,我使用了一种阴暗的技巧,用数值重命名allCosts数据框的列。这可能是个坏主意,我希望看到更好的方法

costsM <- melt(allCosts, id.vars="plan") 
names(costsM)[2:3] <- c("expense", "actualOOP")
#melt() interprets the column names as a factor. We have to turn them back into numeric,
#    by turning them into characters first and then numerics.
costsM$expense <- as.character(costsM$expense)
costsM$expense <- as.numeric(costsM$expense)

#Plot the data
p <- ggplot() + geom_line(data=costsM, aes(x=expense, y=actualOOP, colour=plan))
print(p)

我的方法基本上是这样的,只是步骤不同而已。我从一个函数开始,该函数接受
计划
ded
oop
exp\u oop
,并返回一个函数,该函数给出给定费用的成本(基于这些参数)。[注:我假设第二层和第三层之间的间隔是
exp\u oop
,而不是问题中最初所述的
oop
。]

cost_generator <- function(ded, oop, exp_oop, ...) {
  function(expenses) {
    ifelse(expenses < ded, 
           expenses, 
           ifelse(expenses < exp_oop, 
                  ded + (0.1 * (expenses-ded)),
                  oop))
  }
}
对于每个功能,确定给定费用范围的成本。在这里,我选择了从0到50000美元的范围,增量为100美元

pts <- ldply(funs, function(f) {
  expenses <- seq(0, 50000, 100)
  data.frame(expenses=expenses, cost=f(expenses))
})

当然,这不是真正的成本,而是为给定的费用水平从口袋里支付的金额。总成本将包括额外的东西(至少是保险费)

编辑:

如果要确保包含每个变更点(不依赖于舍入到最接近的$100),可以从
dat
中提取这些点并使用这些点:

library("reshape2")
exps <- melt(dat, id.var="plan")$value
exps <- c(0, exps, 1.1*max(exps))

pts <- ldply(funs, function(f) {
  data.frame(expenses=exps, cost=f(exps))
})
库(“重塑2”)

exps听起来像是要编写一个自定义函数,根据您描述的规则计算费用,然后使用该函数计算一系列
x的成本。从您的描述来看,第二层和第三层之间的边界应该是
exp\u oop
,而不是
oop
@BrianDiggs Fixed--很好!谢谢你的回答。比我想象的要复杂。我最好用电子表格和csv来计算?我手动创建了一个,我相信你的图表有问题。这三段应为斜率=1、斜率=0.1、斜率=0,且无大的跳跃。由于某种原因,蓝线急剧上升。看一看。这只是一个图像比例的东西,还是你的不太合适?(忽略虚线;这些虚线仅显示基于保费节省和公司HSA供款的调整成本。)我对costFinder函数的编码可能有错误。我喜欢它。谢谢你能解释一下
函数(f)
的作用吗?我没有看到对
f
的任何引用。。。此外,这将稍微不准确,精确到100,对吗?如果不让我的序列包含所说的x值,就无法以这些变化的实际值作为斜率变化的目标,对吗?
函数(f)
声明和匿名函数,匿名函数以一个函数(在匿名函数中名为
f
)作为其唯一参数。该函数是在创建data.frame(
cost=f(expenses)
)时调用的。感谢您对该函数的说明(在我学习R的过程中根本没有涉及到这一点)。重新。问题的第二部分,我四处寻找,相信我可以从数据本身生成序列:
排序(plot[!duplicated(plot$x),“x”])
。这些是我试图绘制的图中唯一重要的x值。整洁的东西。顺便说一句,看起来你在
pts@Hendy之后遗漏了一个结束语
,谢谢你抓住了遗漏的括号;一定是剪切粘贴错误。我现在已经确定了答案。
#Add vertical lines for the expected OOP, if you like - arguably it makes things more confusing.
p + geom_vline(data=dat, aes(xintercept=exp_oop, colour=plan))
cost_generator <- function(ded, oop, exp_oop, ...) {
  function(expenses) {
    ifelse(expenses < ded, 
           expenses, 
           ifelse(expenses < exp_oop, 
                  ded + (0.1 * (expenses-ded)),
                  oop))
  }
}
library("plyr")
funs <- mlply(dat, cost_generator)
pts <- ldply(funs, function(f) {
  expenses <- seq(0, 50000, 100)
  data.frame(expenses=expenses, cost=f(expenses))
})
library("ggplot2")
ggplot(pts, aes(expenses, cost, colour=plan)) +
  geom_line()
library("reshape2")
exps <- melt(dat, id.var="plan")$value
exps <- c(0, exps, 1.1*max(exps))

pts <- ldply(funs, function(f) {
  data.frame(expenses=exps, cost=f(exps))
})