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;
答案 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的一部分也是。