假设我们有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,而不是在数据步骤结束时。因为这是在数据步骤结束之前,这是否意味着删除它会导致没有区别?
答案 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;