SAS if-else如果不工作

时间:2017-10-18 14:09:11

标签: sas

combd dataset

SAS正在检查第一个if语句,并因某些原因忽略其他语句。对于一对偶然的课程" = 1,而对于所有其他人,它是空白的。我该怎么办?我确实需要括号来对那些"或"进行分组。陈述对。附件是combd数据集。刚刚注意到那个SAS有等级= 1的障碍,这是错误的!

data clustered;
set combd;
 if ((393821 ge avpm le 450041) or (337601 ge avpm le 393821) or (225161  
  ge avpm le 281381)) and (.8768 ge fsp le 1) then class='1';
   else if ((112720 ge avpm le 168940) or (56500 ge avpm le 112720) or  
    (280.06 ge avpm le 56500)) and (.8768 ge fsp le 1) then class='2';
     else if (280.06 ge avpm le 56500) and ((.507 ge fsp le .6303) or 
      (.3838 ge fsp le .507) or (.2606 ge fsp le .3838)) then class='3';
        else if (280.06 ge avpm le 56500) and ((.1373 ge fsp le .2606) or 
         (.0141 ge fsp le .1373)) then class='4';
          else if (280.06 ge avpm le 56500) and (.8768 ge fsp le 1) then  
           class='5';
            else if (280.06 ge avpm le 56500) and ((.8768 ge fsp le 1) or 
             (.7535 ge fsp le .8768) or (.6303 ge fsp le .7535)) then 
              class='6';
               run;

1 个答案:

答案 0 :(得分:2)

这是错误的:

(393821 ge avpm le 450041)

任何小于393821的数字也将小于450041。

你想要这个:

(393821 le avpm le 450041)

393821低于AVPM小于450041,意思是,avpm介于393821和450041之间。为您的所有数据做到这一点。

第二:不要这样写你的代码。它难以阅读且难以调试。而是使用数据驱动的代码方法。

你在这里真的有一段感情,对吗? [一些AVPM值]和[一些FSP值] - > [一些CLASS值]

所以让我们制作一张桌子:

data class;
input class avpm_min avpm_max fsp_min fsp_max;
datalines;
1 393821 450041 .8768 1
1 337601 393821 .8768 1
1 225161 281381 .8768 1
2 112720 168940 .8768 1
2 056500 112720 .8768 1
2 280.06 056500 .8768 1
3 280.06 056500 .5070 .6303
3 280.06 056500 .3838 .5070
3 280.06 056500 .2606 .3838
6 280.06 056500 .6303 .7535
6 280.06 056500 .7535 .8768
;;;; /*more datalines of course */
run;

然后让我们使用PROC SQL将其加入主表。

data your_data;
input avpm fsp;
obs=_n_;
datalines;
13026.14 .81888
1810.57 .84959
3859.84 .85593
3290.61 .57513
10704.72 .71414
;;;;
run;

proc sql;
  select d.obs, d.avpm, d.fsp, c.class from
    your_data d
    left join class c
    on c.avpm_min le d.avpm le c.avpm_max
    and c.fsp_min le d.fsp  le c.fsp_max
    order by d.obs
    ;
quit;

你去。

我还注意到你的IF / ELSE组合对4/5/6来说真的没有意义。 5是不可能的(它完全被2包含),6的一部分也是。