SAS中的IF-THEN和IF

Elv*_*vis 5 sas

IF和之间有什么区别IF-THEN

例如以下声明

if type='H' then output;

vs

if type='H';
output;
Run Code Online (Sandbox Code Playgroud)

cat*_*uas 7

if-then语句有条件地执行代码.如果对于给定的观察满足条件,则在;执行之前的'then'之后的任何条件,否则它不是.在您的示例中,由于以下内容output,仅将具有类型的观察'H'输出到由数据步骤构建的数据集.您还可以使用if-then-do语句,例如在以下代码中:

if type = 'H' then do;
i=1;
output;
end;
Run Code Online (Sandbox Code Playgroud)

if-then-do语句有条件地执行do;和之间的代码end;.因此,上述代码执行i=1;output;仅当类型等于'H'.

一个if没有then是一个"子集,如果".根据SAS文档:

子集化IF语句在将观察读入程序数据向量(PDV)之后测试条件.如果条件为真,则SAS继续处理当前观察.否则,丢弃观察结果,并继续进行下一次观察.

因此,如果type='H'不满足子集化if(ex.)的条件,则观察不会输出到由数据步骤创建的数据集.在您的示例中,仅'H'输出类型为的观察值.

总之,两个示例代码产生相同的结果,但是通过不同的方式.if type='H' then output;只输出类型为的观测值'H',而if type='H'; output;丢弃类型不是的观测值'H'.请注意,在后者中您不需要,output;因为SAS数据步骤中存在隐式输出,只有存在显式output;命令时才会覆盖该输出.

  • 这大多是正确的.然而,从技术上讲,子集"if"不会阻止输出; 在大多数情况下,它确实不仅仅是阻止输出.具体来说,子集"if"终止数据步骤循环的当前迭代并返回到数据步骤的顶部; 类似于`if(...)然后返回.这很重要,因为在失败的子集化"if"之后的任何内容都不会在该行中执行.子集"if"确实阻止了自动输出(因为它会阻止非自动`输出;`上面)但不影响早期的`output`语句. (5认同)