Sas 使用FIRST和LAST时的输出

Sas 使用FIRST和LAST时的输出,sas,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; 如果我删除“if LAST.KEY THE

假设我们有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;

如果我删除“if LAST.KEY THEN OUTPUT;”,这里会发生什么变化。表示输出导致SAS立即写入数据步骤,而不是在数据步骤结束时写入。因为在这里它正好在数据步骤结束之前,这是否意味着删除它不会导致任何差异

此处逗号是一个错误:

(keep=KEY, COUNT, C_AMT2, C_AMT)
无论如何:

RUN;
通常指:

output;
return;
但是,如果SAS在代码中遇到
output
语句,则末尾的
output
(包含在run语句中)将被忽略

因此,由于您的
输出
语句只有在LAST.KEY的情况下才有条件地执行
,因此在您的数据集中只有标记为LAST.KEY的观察值,因为您的
运行
仅表示返回

比如:

data want; set have; output; run;
与非显式输出完全相同:

data want; set have; output; run;
您可以根据需要使用输出:

data want01 want02;
set have;
if a then output want01;
if b then output want02;
run;

data want01;
var=var1;
output;
var=var2;
output;
run;

逗号在这里是一个错误:

(keep=KEY, COUNT, C_AMT2, C_AMT)
无论如何:

RUN;
通常指:

output;
return;
但是,如果SAS在代码中遇到
output
语句,则末尾的
output
(包含在run语句中)将被忽略

因此,由于您的
输出
语句只有在LAST.KEY
的情况下才有条件地执行
,因此在您的数据集中只有标记为LAST.KEY的观察值,因为您的
运行
仅表示返回

比如:

data want; set have; output; run;
与非显式输出完全相同:

data want; set have; output; run;
您可以根据需要使用输出:

data want01 want02;
set have;
if a then output want01;
if b then output want02;
run;

data want01;
var=var1;
output;
var=var2;
output;
run;

移除它将导致不同

然后,假设有多个值,您将为key的每个值都有一个记录。控制输出意味着只有最后一条记录

它看起来像是在计算一个计数和总数,所以有其他方法来实现这一点。我假设还有其他一些代码被你抑制了

您上面的链接中有文档中与此相关的部分

隐式输出与显式输出

默认情况下,每个数据步骤在每次迭代结束时都包含一个隐式输出语句,该语句告诉SAS将观察结果写入正在创建的一个或多个数据集在数据步骤中放置显式输出语句会覆盖自动输出,并且SAS仅在执行显式输出语句时才会向数据集添加观察。一旦使用输出语句向任何一个数据集写入观察,则在数据步骤的结尾处不会有隐式输出语句。在这种情况下,数据步骤仅在执行显式输出时才将观察写入数据集。您可以单独使用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
没有最后一把钥匙 Obs密钥i金额计数C_金额

                       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

移除它将导致不同

然后,假设有多个值,您将为key的每个值都有一个记录。控制输出意味着只有最后一条记录

它看起来像是在计算一个计数和总数,所以有其他方法来实现这一点。我假设还有其他一些代码被你抑制了

您上面的链接中有文档中与此相关的部分

隐式输出与显式输出

默认情况下,每个数据步骤在每次迭代结束时都包含一个隐式输出语句,该语句告诉SAS将观察结果写入正在创建的一个或多个数据集在数据步骤中放置显式输出语句会覆盖自动输出,并且SAS仅在执行显式输出语句时才会向数据集添加观察。一旦使用输出语句向任何一个数据集写入观察,则在数据步骤的结尾处不会有隐式输出语句。在这种情况下,数据步骤仅在执行显式输出时才将观察写入数据集。您可以单独使用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
没有最后一把钥匙 Obs密钥i金额计数C_金额

                       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

我懂了。因此,它将c_amt变量与每个键变量相加,然后为每个键向数据集写入一次。如果我删除If LAST.KEY,那么会发生什么@statIf输出不是有条件地使用last.key执行的,每个迭代的一个观察结果将输出到最终的数据集中。数据需求;集有;somecode;产出;跑与不显式输出完全相同。@Danzo,为什么不删除它并运行它?或者生成样本数据并对其进行测试?是的,我同意@Reeza,测试是理解SAS所做工作的最佳方式。我明白了。因此,它将c_amt变量与每个键变量相加,然后为每个键向数据集写入一次。如果我删除If LAST.KEY,那么会发生什么@statIf输出不是有条件地使用last.key执行的,每个迭代的一个观察结果将输出到最终的数据集中。数据需求;集有;somecode;产出;跑与不显式输出完全相同。@Danzo,为什么不删除它并运行它?或者生成样本数据并对其进行测试?是的,我同意@Reeza的观点,测试是理解SAS正在做什么的最佳方式。C_AMT2在first.KEY语句中设置为0这一事实有点奇怪,如果这是一个运行总数,我希望它是C_AMT2。C_AMT2在first.KEY语句中设置为0这一事实有点奇怪,如果这是一个连续的总数,我希望它是C_AMT。