R 以比深入嵌套的ifelse块更好的方式处理条件语句
我正试图写一些代码来分析我公司的保险计划。。。但它们很复杂!PPO计划很简单,但高免赔额健康计划很复杂,因为他们为家庭计划引入了“分割”免赔额和自付最高限额(个人和全部)。它的工作原理如下:R 以比深入嵌套的ifelse块更好的方式处理条件语句,r,if-statement,conditional,R,If Statement,Conditional,我正试图写一些代码来分析我公司的保险计划。。。但它们很复杂!PPO计划很简单,但高免赔额健康计划很复杂,因为他们为家庭计划引入了“分割”免赔额和自付最高限额(个人和全部)。它的工作原理如下: 一旦个人符合个人免赔额,他/她将获得90%的保险 一旦计划中剩余的1+个人达到总免赔额,整个家庭的保险覆盖率为90% 个人不能仅以其医疗费用满足家庭免赔额 我想输入我的家庭成员的支出向量(有四个),并输出每个计划的总成本。下表列出了可能出现的情况,列代码如下: ded_ind:是否有个人符合个人免赔额
- 一旦个人符合个人免赔额,他/她将获得90%的保险
- 一旦计划中剩余的1+个人达到总免赔额,整个家庭的保险覆盖率为90%
- 个人不能仅以其医疗费用满足家庭免赔额
:是否有个人符合个人免赔额ded_ind
:是否达到了总免赔额ded_tot
:是否达到了个人自掏腰包的最高限额oop\u ind
:是否达到了总的现金最高限额oop\u tot
=支出最高者的费用exp\u ind
=剩余/其他/家庭成员的费用(不是最高支出者)exp\u rem
=个人支付其自付最高限额的费用水平(当oop\u max\u ind
个人自付最高限额时)ded\u ind+0.1*exp\u ind=
=与个人相同,但适用于剩余的家庭成员oop\u max\u fam
| ded_ind | oop_ind | ded_rem | oop_rem | formula
|---------+---------+---------+---------+---------------------------------------------------------------------------|
| 0 | 0 | 0 | 0 | exp_ind + exp_rem |
| 1 | 0 | 0 | 0 | ded_ind + 0.1 * (exp_ind - ded_ind) + exp_rem |
| 0 | 0 | 1 | 0 | exp_ind + ded_rem + 0.1 * (exp_rem - ded_rem) |
| 1 | 1 | 0 | 0 | oop_max_ind + exp_fam |
| 1 | 0 | 1 | 0 | ded_ind + 0.1 * (exp_ind - ded_ind) + ded_rem + 0.1 * (exp_rem - ded_rem) |
| 0 | 0 | 1 | 1 | oop_max_rem + exp_ind |
| 1 | 0 | 1 | 1 | ded_ind + 0.1 * (exp_ind - ded_ind) + oop_max_rem |
| 1 | 1 | 1 | 0 | oop_ind_max + ded_rem + 0.1 * (exp_rem - ded_rem) |
| 1 | 1 | 1 | 1 | oop_ind_max + oop_rem_max |
省略:0 1 0 0
、0 0 1
、0 1 1 0
和0 1 0 1
不存在,因为如果分别未满足ded_ind
和ded_rem
,则不可能满足oop_ind
和oop_rem
我当前的代码是一个有点大的ifelse
循环(不是代码,而是它的功能):
检查计划是ppo还是hsa
如果hsa计划
如果exp_ind+exp_remoop_ind#u max#ded#u ind met,是oop_ind吗?
ded_ind+0.1*(exp_ind-ded_ind)+exp_fam#没有达到oop_max_ind
否则oop_max_ind+exp_fam#达到oop_max_ind
其他的
在else之后,总数大于家庭免赔额。我检查是否有两个人以上的人缴纳,然后继续这样做
我的问题是,现在我已经给出了一些问题的背景:有没有比ifelse
循环更好的方法来管理像这样的条件情况,以便一次过滤一点
当我们检查一些更高级别的条件时,代码看起来是多余的(考虑满足或不满足ded_-rem
的表格……在这两种情况下,仍然需要检查ded_-ind
和oop_-max_-ind
,代码是相同的……只是位于ifelse
结构中的两个不同位置)
这可以通过某种矩阵运算来实现吗?网上有没有其他更聪明的方法来处理条件过滤的例子
非常感谢你的建议
另外,我正在使用R,并将创建一个与
shinny
的交互界面,以便其他员工可以为他们的每个家庭成员输入最佳和最坏情况,并通过点图或条形图查看哪种计划会提前出台。根据结果将其转换为二进制值的建议给了我一个想法,这也帮助我学习一个人可以做向量化的TRUE
/FALSE
检查(我想这对很多人来说可能是显而易见的)
以下是我目前的想法:
费用
将是当年个人预测医疗费用的一个向量(以三个人为例):
对于任何给定的计划,我可以设置一个带有截止值的向量,例如:
- 个人免赔额=1000
- 个人自掏腰包最大值=2000(需要花费11k才能到达)
- 家庭免赔额=2000
- 家庭自掏腰包最大值=4000(需要花费2.2万美元才能到达)
ded_ind <- 1000
oop_max_ind <- 11000
ded_tot <- 2000
oop_max_tot <- 22000
cutoffs <- c(ded_ind, oop_max_ind, ded_tot, oop_max_tot)
我们可以检查这个
- 挥金如土的人会先支付1000英镑,然后再支付剩余500英镑的10%=1050英镑
- 其他成员未达到家庭免赔额,并全额支付400+100=500
- 总数:1550
结果\u bin
值映射到相应函数的映射,但在我看来,执行向量化检查并转换唯一的二进制值比我的ifelse
嵌套函数要好得多
我是这样看的:无论如何,我必须设置变量并编写函数;这节省了我1)显式编写所有条件,2)我所说的冗余问题,其中一个最终在
ifelse
结构中编写父拆分的相同“兄弟”分支,最后,3)代码非常非常非常,更容易理解。因为这个问题不是很具体,这里有一个更简单的例子/答案:
# example data
test <- expand.grid(opt1=0:1,opt2=0:1)
# create a unique identifier to represent the binary variables
test$code <- with(allopts,paste(opt1,opt2,sep=""))
# create an input variable to be used in functions
test$var1 <- 1:4
# opt1 opt2 code var1
#1 0 0 00 1
#2 1 0 10 2
#3 0 1 01 3
#4 1 1 11 4
使用ifelse
组合进行计算:
test$result <- with(test,
ifelse(code == "00", var1 + 10,
ifelse(code == "10", var1 + 100,
ifelse(code == "01", var1 + 1000,
ifelse(code == "11", var1 + var1,
NA
)))))
您刚刚提供了一个基于四个布尔值的状态表。逻辑上的方法是将它们视为介于0和15之间的二进制数。只需将这些映射到适当的函数即可。很有趣!因此,我只需要做四个检查:1)大于
ded_ind
,2)大于oop_ind_max
,3)大于ded_rem
,4)大于oop_rem_max
,然后返回这四个值(0或1)并计算二进制等价物——这就是要点吗?您可以这样做
ded_ind <- 1000
oop_max_ind <- 11000
ded_tot <- 2000
oop_max_tot <- 22000
cutoffs <- c(ded_ind, oop_max_ind, ded_tot, oop_max_tot)
result <- as.numeric(rep(c(exp_ind, exp_rem), each = 2) > cutoffs)
result_bin <- sum(2^(seq_along(result) - 1) * result)
if(result_bin == 1) {cost <- ded_ind + 0.1 * (exp_ind - ded_ind) + exp_rem }
cost
[1] 1550
# example data
test <- expand.grid(opt1=0:1,opt2=0:1)
# create a unique identifier to represent the binary variables
test$code <- with(allopts,paste(opt1,opt2,sep=""))
# create an input variable to be used in functions
test$var1 <- 1:4
# opt1 opt2 code var1
#1 0 0 00 1
#2 1 0 10 2
#3 0 1 01 3
#4 1 1 11 4
var1 + 10 #code 00 - intended result = 11
var1 + 100 #code 10 - intended result = 102
var1 + 1000 #code 01 - intended result = 1003
var1 + var1 #code 11 - intended result = 8
test$result <- with(test,
ifelse(code == "00", var1 + 10,
ifelse(code == "10", var1 + 100,
ifelse(code == "01", var1 + 1000,
ifelse(code == "11", var1 + var1,
NA
)))))
opt1 opt2 code var1 result
1 0 0 00 1 11
2 1 0 10 2 102
3 0 1 01 3 1003
4 1 1 11 4 8