SAS`select` ...`when`基于范围

时间:2015-07-27 19:54:18

标签: select if-statement sas

如果固定变量属于特定范围,我需要完成代码块,例如

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;

2 个答案:

答案 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;