SAS中的最小/最大功能解决方案
基本上,我想要做的是在修改表格时使用最小/最大功能。我正在修改一个表格,添加一列,然后将该列设置为最小/最大函数的组合。但是,在SAS中,您不能使用汇总功能。有没有办法解决这个问题?SAS中的最小/最大功能解决方案
还有更多的输入,但为了清晰起见,缩写版本在下面!谢谢!
%let variable = 42
alter table X add Z float;
update X
set C = min(max(0,500 - %sysevalf(variable)),0);
首先,让我们除去%sysevalf()
,他们不需要和格式可读性
alter table claims.simulation add Paid_Claims_NoISL float;
update claims.simulation
set Paid_Claims_NoISL
= min(
max(0
, Allowed_Claims -&OOPM
, min(Allowed_Claims
,&Min_Paid+ max(Allowed_Claims - &Deductible * &COINS
,0
)
)
, &Ind_Cap_Claim
)
);
注意,第一min()
只有1个说法。这是导致你的错误。 SAS认为,因为它只有1个输入,所以您想总结一个列,这在更新中是不允许的。
就拿了这一点,它应该工作:
alter table claims.simulation add Paid_Claims_NoISL float;
update claims.simulation
set Paid_Claims_NoISL
= max(0
, Allowed_Claims -&OOPM
, min(Allowed_Claims
,&Min_Paid+ max(Allowed_Claims - &Deductible * &COINS
,0
)
)
, &Ind_Cap_Claim
);
要引用宏变量的值,您需要使用&。
%let mvar = 42;
proc sql;
update X set C = min(max(0,500 - &mvar),0);
quit;
注意没有必要使用宏功能%SYSEVALF()
因为SAS可以更容易地处理的情况下,当值&mvar
比宏处理器罐的表达式。
%let mvar = 500 - 42;
proc sql;
update X set C = min(max(0,&mvar),0);
quit;
哦是的。我很抱歉,我忘了包括这一点。我在调用每个变量之前都有“&” – indiansrulz
我不断收到错误:错误:列Paid_Claims_NoISL引用的值表达式不能直接包含汇总函数。 – indiansrulz
在您发布在MIN()函数下面的更复杂的代码中,只有一个参数。因此,SAS认为您希望汇总所有观察结果,而在这个简单的更新声明中您无法做到这一点。你真的想要通过许多观察的最小值?或者你只是想使用min()函数来设置最大值? – Tom
你是不是想使这个'分钟(MAX(0,500-42),0)'或'分钟(MAX(0,500变量),0 )'?你有第二个,但我想知道你是否想要第一个。 – DomPazz
我想要第一个。有很多变量被设置为在程序开始时输入的特定数字,我正在调用这些值本身。因此,表达式将评估为0. – indiansrulz
您是否尝试使用SQL聚合函数'min()'和'max()'或SAS函数'min(,)'和'max(,)'?由于有多个参数,并且文本提到了“汇总”功能,该程序正在使用较晚的版本。 – Tom