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”语句进行比较。