R 以比深入嵌套的ifelse块更好的方式处理条件语句

R 以比深入嵌套的ifelse块更好的方式处理条件语句,r,if-statement,conditional,R,If Statement,Conditional,我正试图写一些代码来分析我公司的保险计划。。。但它们很复杂!PPO计划很简单,但高免赔额健康计划很复杂,因为他们为家庭计划引入了“分割”免赔额和自付最高限额(个人和全部)。它的工作原理如下: 一旦个人符合个人免赔额,他/她将获得90%的保险 一旦计划中剩余的1+个人达到总免赔额,整个家庭的保险覆盖率为90% 个人不能仅以其医疗费用满足家庭免赔额 我想输入我的家庭成员的支出向量(有四个),并输出每个计划的总成本。下表列出了可能出现的情况,列代码如下: ded_ind:是否有个人符合个人免赔额

我正试图写一些代码来分析我公司的保险计划。。。但它们很复杂!PPO计划很简单,但高免赔额健康计划很复杂,因为他们为家庭计划引入了“分割”免赔额和自付最高限额(个人和全部)。它的工作原理如下:

  • 一旦个人符合个人免赔额,他/她将获得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