【发布时间】:2014-05-18 02:36:47
【问题描述】:
IF和IF-THEN有什么区别
例如下面的语句
if type='H' then output;
vs
if type='H';
output;
【问题讨论】:
-
Subsetting IF Statement 上 SAS 文档的比较部分详细介绍了子集“IF”与“IF-THEN”和“WHERE”语句的比较。
标签: sas
IF和IF-THEN有什么区别
例如下面的语句
if type='H' then output;
vs
if type='H';
output;
【问题讨论】:
标签: sas
if-then 语句有条件地执行代码。如果给定观察满足条件,则执行; 之前的“then”之后的任何内容,否则不满足。在您的示例中,由于后面是output,因此只有'H' 类型的观察结果才会输出到数据步骤正在构建的数据集。你也可以有一个 if-then-do 语句,比如下面的代码:
if type = 'H' then do;
i=1;
output;
end;
If-then-do 语句有条件地执行do; 和end; 之间的代码。因此,上面的代码只有在 type 等于 'H' 时才会执行 i=1; 和 output;。
没有then 的if 是“子集if”。根据SAS documentation:
子集 IF 语句测试观察后的条件 读入程序数据向量(PDV)。如果条件为真,SAS 继续处理当前观察。否则,该 观察被丢弃,处理继续下一个 观察。
因此,如果不满足子集 if (ex. type='H') 的条件,则观察不会输出到由数据步骤创建的数据集。在您的示例中,只会输出类型为 'H' 的观察结果。
总而言之,您的两个示例代码产生相同的结果,但采用不同的方式。 if type='H' then output; 只输出类型为'H' 的观察,而if type='H'; output; 丢弃类型不是'H' 的观察。请注意,在后者中,您不需要 output;,因为 SAS 数据步骤中有一个隐式输出,只有在有明确的 output; 命令时才会被覆盖。
【讨论】:
if 并不会阻止输出;在大多数情况下,它所做的不仅仅是简单地阻止输出。具体来说,子集if终止了data step循环的当前迭代,并返回到data step的顶部;类似于if (...) then return。这很重要,因为失败的子集if 之后的任何内容都不会在该行中执行。子集 if 确实会阻止自动输出(因为它会阻止上面的非自动 output;),但不会影响之前的 output 语句。
它们相似但不相同。在一个数据步中,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;
在这两个示例中,如果type = 'H',x 将增加 1,但在第一个数据步骤中,baz 将不包含任何类型不等于 'H' 的观察值。
如今,过去由if 完成的大多数事情似乎都是使用where 完成的。
【讨论】: