IF
和IF-THEN
例如以下声明
if type='H' then output;
vs
if type='H';
output;
答案 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
完成的。