这在数据步骤中意味着什么?

时间:2013-01-14 13:32:14

标签: sas datastep

在这个数据步骤中,我不明白if last.y做了什么...... 你能告诉我吗?

data stop2;
    set stop2;
    by x y z t;

if last.y; /*WHAT DOES THIS DO ??*/

    if t ne 999999 then
        t=t+1;
    else do;
            t=0;
        z=z+1;
    end;
run;

3 个答案:

答案 0 :(得分:6)

LAST.Y指的是Y值更改之前的行。因此,在以下数据集中:

data have;
input x y z;
datalines
1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 3 3
2 3 1
2 3 2
2 3 3
;;;;
run;

LAST.Y将出现在该数据集中的第三行,第六行,第九行和第十二行(在Z = 3的每一行上)。前两次是当Y即将从1变为2时,以及当它即将从2变为3.第三次是X即将改变时 - LAST.Y在Y即将改变时触发< em>或当BY列表中的任何变量发生变化时。最后,数据集中的最后一行总是最后一行。(无论如何)。

在上面的特定数据集中,子集化if表示您只取每组Y的最后一行。在这段代码中:

data want;
set have;
by x y z;
if last.y;
run;

您最终会得到以下数据集:

data want;
input x y z;
datalines;
1 1 3
1 2 3
1 3 3
2 3 3
;;;;
run;

最后。

如果您想了解FIRST和LAST的运作方式,可以使用PUT _ALL_;。例如:

data want;
set have;
by x y z;
put _all_;
if last.y;
run;

它将显示数据集上的所有变量,包括FIRST。(无论如何)和LAST。(无论如何)。 (FIRST.Y和LAST.Y实际上是变量。)

答案 1 :(得分:0)

在SAS中,首先。最后。是在数据步骤中隐式创建的变量。 每个变量都有第一个。和最后一个。对应于DATA步骤中的每条记录。这些值将是0或1. last.y与last.y = 1时的说法相同。

请在此处查看info

答案 2 :(得分:0)

这是对IF语句进行子集化的示例。这与IF / THEN声明不同。它基本上意味着如果条件不成立,则立即停止数据步骤的迭代 所以

if last.y;

相当于

if not last.y then delete;

if not last.y then return;

if last.y then do;
  ... rest of the data step before the run ...
end;