if语句和where语句是SAS中最常用的逻辑判断语句,主要用于数据筛选和条件赋值。当进行多分支的条件判断时,可以使用if...else语句来实现。如下:
if .<AGE<18 then AGEGR1N=1;
else if 18<=AGE<=40 then AGEGR1N=2;
else if 41<=AGE<=64 then AGEGR1N=3;
else if 65<=AGE<=75 then AGEGR1N=4;
else if AGE>75 then AGEGR1N=5;
AGEGR1=choosec(AGEGR1N,'18yr以下','18-40yr','41-64yr','65-75yr','75yr以上');
理论上,else的语句可以无限长,囊括所有条件判断和操作,但如果条件判断过多,为了简化程序,可以使用select语句,其语法如下:
select;
when(条件1) 操作语句1;
when(条件2) 操作语句2;
...
otherwise 操作语句n;
end;
该语句的用途是根据某变量不同的值(值1,值2,…)进行不同的操作,最后以otherwise设定when语句没有包含的情况下的操作。可以用在计划外其他检查中存在有实验室检查指标的值时,例如:
data fa(where=(^missing(LBCAT)));
format LBTEST LBTESTCD LBORRES LBSTRESU $200.;
length LBTEST LBTESTCD LBORRES LBSTRESU $200.;
set raw.fa(in=a rename=(FACLSIG=LBCS FACAT=LBCAT FAORRES=LBORRES FAORRESU=LBSTRESU FADESC=ADES));
if a then do;
select(FATEST);
when('嗜酸细胞百分比') do;LBTEST='嗜酸细胞百分比'; LBTESTCD='EO'; end;
when('RBC-M红细胞(高倍视野)') do;LBTEST='红细胞(高倍视野)'; LBTESTCD='URBC'; end;
when('WBC-M白细胞(高倍视野)') do;LBTEST='白细胞(高倍视野)'; LBTESTCD='UWBC'; end;
when('高密度脂蛋白胆固醇') do;LBTEST='高密度脂蛋白胆固醇'; LBTESTCD='HDL'; end;
when('天门冬氨基酸基转移酶') do;LBTEST='天门冬氨基酸基转移酶'; LBTESTCD='AST';end;
when('丙氨酸氨基转移酶') do;LBTEST='丙氨酸氨基转移酶'; LBTESTCD='ALT'; end;
when('γ-谷氨酰基转移酶') do;LBTEST='γ-谷氨酰基转移酶'; LBTESTCD='GGT'; end;
other LBCAT='';
end;
end;
run;
除了if语句和select语句,where语句也能达成类似的功能。需要注意的是,where语句只能用于数据筛选,而不能用于条件赋值。
if语句是在PDV执行之后才执行,针对待处理数据进行筛选或赋值,而where语句是在PDV执行之前就已经被执行,当数据被读取至缓冲区的时候就已经被筛选完成。
if与where在应用时的更多差别如下所示:
if | where |
---|---|
执行在PDV之后 | 执行在PDV之前 |
在by语句之后执行 | 在by语句之前执行 |
data步创建的变量可以在接下来的if语句中被使用 | data步创建的变量无法被where使用,因为where语句在变量创建前已经执行 |
执行速度比where慢 | 执行速度更快,因为在待处理数据创建前已经筛选部分数据 |