如果固定变量属于特定范围,我需要完成代码块,例如
IF attained_age > 84 AND attained_age < 90 then
do;
/* block 1*/
end;
ELSE IF attained_age > 89 AND attained_age < 95 then
do;
/* block 2*/
end;
ELSE IF attained_age > 94 then
do;
/* block 3*/
end;
有没有更好的方法来写这个,例如像SELECT...WHEN
这样的东西?我宁愿不在WHEN
条款中列出所有达到年龄的个人值,但是......
UPDATE 代码块涉及设置一组名称相似的变量,例如
sev_alpha = &UFLIC_LM_90_94_Alpha;
sev_sigma = &UFLIC_LM_90_94_Sigma;
sev_theta = &UFLIC_LM_90_94_Theta;
或
sev_alpha = &UFLIC_LM_95_Alpha;
sev_sigma = &UFLIC_LM_95_Sigma;
sev_theta = &UFLIC_LM_95_Theta;
答案 0 :(得分:3)
我可以为sev_alpha
做示例,尽管这可以推广到其他两个。我很遗憾无法测试此代码,因为我本周离开了我的办公室(以及SAS许可证),但这应该可行。
有一种方法可以使用PROC FORMAT
来处理这种用例。首先,你像这样写PROC FORMAT
:
PROC FORMAT;
VALUE fmt_alpha
84 <- 90 = "&UFLIC_LM_84_90_Alpha"
90 <- 95 = "&UFLIC_LM_90_95_Alpha"
95 - high = "&UFLIC_LM_95_Plus_Alpha"
;
RUN;
然后,您可以通过以下方式设置sev_alpha
变量:
sev_alpha = PUT (attained_age, fmt_alpha.);
在此示例中,<-
表示>=
,high
表示最大数值。要执行其他两个变量,只需在VALUE
内添加两个对应的PROC FORMAT
块,并使用类似的PUT()
调用来设置变量。
可以找到以这种方式使用PROC FORMAT
的一些好文档in this article。基本上这是我从数字变量创建分类变量的首选方法,它通常比多个if/else
子句执行得更快。再次道歉我今天无法测试,但它至少接近解决方案。
答案 1 :(得分:2)
根据您的复杂程度,我认为有两种简单的方法可以做到这一点。
核心概念是使用symget
来获取宏变量的值。这允许您在数据步骤中构造宏变量引用,否则您无法做到。我更喜欢将这个宏引用存储在proc format
中,就像sparc_spread一样,如果这个值实际上是宏变量的话。 (如果没有,则跳过变量步骤,只将存储在宏变量中的值存储在proc格式参考中。)
这使您可以轻松编译一堆引用;你不必为每个变量或类似的东西设置一套单独的格式,只需要一个。 (我认为这就是sparc_spread对该答案的评论。)
这可以与proc format
结合使用,或者如果更有意义的话,可以在数据步骤中完成 - 例如,如果您的范围都是5的组,例如,这可能更容易做数学提出价值观。
这是两个例子:
%let lim_90_94=9094;
%let lim_95=95+;
%let lim_85_89=8589;
proc format;
value agef
85-89='85_89'
90-94='90_94'
95-high='95'
other ='NONE';
quit;
data have;
input age;
datalines;
88
92
96
;;;;
run;
data want;
set have;
val_a = symget(cats('lim_',put(age,agef.)));
val_b = symget(cats('lim_',
floor(age/5)*5,
ifc(age>95,'',(cats(
'_',
ceil(age/5)*5-1)))));
put age= val_a= val_b=;
run;