【问题标题】:IF-THEN vs IF in SASSAS 中的 IF-THEN 与 IF
【发布时间】:2014-05-18 02:36:47
【问题描述】:

IFIF-THEN有什么区别

例如下面的语句

if type='H' then output;

vs

if type='H';
output;

【问题讨论】:

  • Subsetting IF Statement 上 SAS 文档的比较部分详细介绍了子集“IF”与“IF-THEN”和“WHERE”语句的比较。

标签: sas


【解决方案1】:

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;

没有thenif 是“子集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 语句。
【解决方案2】:

它们相似但不相同。在一个数据步中,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 完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多