使用FIRST和LAST时的输出

时间:2015-08-18 15:30:12

标签: sas

假设我们有SAS代码:

data t1 (keep=KEY COUNT C_AMT2 C_AMT);  
SET t1;
BY key;
RETAIN COUNT C_AMT;

IF FIRST.KEY THEN
    DO;
        COUNT=0;
        C_AMT2=0;
    END;

COUNT+1;
C_AMT=SUM(C_AMT2, C_AMT);

IF LAST.KEY THEN
OUTPUT;

RUN;

如果我要移除"如果最后那么,那将会有什么变化。然后输出;"。 documentation表示输出会导致SAS立即写入datastep,而不是在数据步骤结束时。因为这是在数据步骤结束之前,这是否意味着删除它会导致没有区别?

2 个答案:

答案 0 :(得分:3)

删除它会产生差异。

然后,假设有多个值,您将获得每个键值的记录。控制输出意味着您只拥有最后一条记录。

看起来它正在计算一个计数和总数,所以还有其他方法来实现这一目标。我会假设还有其他一些你已被压制的代码。

引用此文档的相关部分位于您上面的链接

  

隐式与显式输出

     

默认情况下,每个DATA步骤在每次迭代结束时都包含一个隐式OUTPUT语句,该语句告诉SAS将观察结果写入正在创建的数据集或数据集。 在DATA步骤中放置显式OUTPUT语句会覆盖自动输出,只有在执行显式OUTPUT语句时,SAS才会向数据集添加观察值。一旦使用OUTPUT语句将观察值写入但是,在任何一个数据集中,DATA步骤结束时都没有隐式的OUTPUT语句。在这种情况下,DATA步骤仅在显式OUTPUT执行时才将观察值写入数据集。您可以单独使用OUTPUT语句,也可以将其作为IF-THEN或SELECT语句的一部分或在DO循环处理中使用。

以下是一些模拟您问题的代码:

*Generate random data;
Data have;
do Key=1 to 2;
    do i=1 to 3;
        Amount=floor(rand('normal', 50, 5));
        OUTPUT;
    end;
end;

run;

data t1;
set have;
retain count C_Amt;
by Key;

if first.key then do;
count=0;
C_Amt=0;
end;

Count+1;
c_amt=sum(c_amt, amount);

if last.key then output;
run;

proc print data=t1;
run;

data t1;
set have;
retain count C_Amt;
by Key;

if first.key then do;
count=0;
C_Amt=0;
end;

Count+1;
c_amt=sum(c_amt, amount);

*if last.key then output;
run;

proc print data=t1;
run;

和相应的输出:

使用last.key然后输出

                      Obs    Key    i    Amount    count    C_Amt

                       1      1     3      46        3       147
                       2      2     3      44        3       154

并且没有last.key                           Obs Key i Amount count C_Amt

                       1      1     1      47        1        47
                       2      1     2      54        2       101
                       3      1     3      46        3       147
                       4      2     1      61        1        61
                       5      2     2      49        2       110
                       6      2     3      44        3       154

答案 1 :(得分:2)

这里的逗号是错误的:

(keep=KEY, COUNT, C_AMT2, C_AMT)

反正:

RUN;

通常意味着:

output;
return;

但是如果SAS在您的代码中遇到output语句,那么最后的output(包含在run语句中)将被忽略。

因此,由于您的output语句仅有条件地执行IF LAST.KEY,因此在您的数据集中,您只会将观察标记为last.key,因为您的RUN;仅表示{{1} }}

类似的东西:

return

与非显式输出完全相同:

data want; set have; output; run;

您可以根据需要使用输出:

data want; set have; output; run;