SAS中的IF-THEN vs IF

SAS中的IF-THEN vs IF,sas,Sas,IF和IF-THEN 例如,下面的语句 if type='H' then output; vs if type='H'; output; 它们相似但不完全相同。在数据步骤中,如果是一个子集语句,则删除所有不满足条件的记录。从文件中: “仅继续处理满足指定表达式条件的观察。” if-then的功能更像其他语言中的if语句,它有条件地执行then子句后面的语句。有点做作的例子: data baz; set foo; if type = 'H'; x = x + 1; run; data ba

IF
IF-THEN

例如,下面的语句

if type='H' then output;

vs

if type='H';
output;

它们相似但不完全相同。在数据步骤中,
如果
是一个子集语句,则删除所有不满足条件的记录。从文件中:

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

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
完成的事情都是使用
完成的,其中
一个if-then语句有条件地执行代码。如果满足给定观察的条件,则在
之前的“then”后面的内容执行,否则不执行。在您的示例中,由于下面是
输出
,因此只有类型为
'H'
的观测值才会输出到数据步骤生成的数据集。您还可以使用if-then-do语句,例如在以下代码中:

if type = 'H' then do;
i=1;
output;
end;
If-then do语句在
do之间有条件地执行代码
结束。因此,上述代码执行
i=1
输出仅当类型等于
'H'

如果
没有
,则
是“子集if”。根据:

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

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


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

这基本上是正确的。如果
在技术上不阻止输出,则进行子集设置
;在大多数情况下,它所做的不仅仅是阻止输出。具体地说,如果
终止数据步循环的当前迭代并返回到数据步的顶部,则子集设置
;类似于
如果(…),则返回
。这一点很重要,因为在子集
if
之后失败的任何内容都不会在该行中执行。子集
if
确实会阻止自动输出(因为它会阻止上述非自动
输出;
),但不会影响早期的
输出
语句。上的SAS文档的比较部分详细介绍了子集“if”如何与“if-THEN”和“WHERE”语句进行比较。