SAS中的IF-THEN和IF

时间:2014-05-18 02:36:47

标签: sas

IFIF-THEN

之间有何区别?

例如以下声明

if type='H' then output;

vs

if type='H';
output;

2 个答案:

答案 0 :(得分:7)

if-then语句有条件地执行代码。如果对于给定的观察满足条件,那么在'之后的任何事情都是如此。在;执行之前,否则它不是。在您的示例中,由于后面的内容为output,因此只有类型为'H'的观测值才会输出到数据步骤构建的数据集。您还可以使用if-then-do语句,例如以下代码:

if type = 'H' then do;
i=1;
output;
end;

if-then-do语句有条件地在do;end;之间执行代码。因此,只有当类型等于i=1;时,上述代码才会执行​​output;'H'

没有if的{​​{1}}是"如果"则为子集。根据{{​​3}}:

  

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

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

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

答案 1 :(得分:3)

它们相似但不完全相同。在数据步骤中,if是子集语句,并且所有不满足条件的记录都将被删除。来自文档:

“继续只处理满足指定表达式条件的观察结果。”

if then函数更像其他语言中的if语句,它有条件地执行then子句之后的语句。一个有点人为的例子:

data baz;
set foo;
if type = 'H';
x = x + 1;
run;

data baz:
set foo;
if type='H' then x = x + 1;
run;

在两个示例中x如果type = 'H'将增加1,但在第一个数据步骤中baz将不包含任何类型不等于'H'的观察结果。

现在似乎if以前完成的大多数事情都是使用where完成的。