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

sta*_*ant 2 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;
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 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;
Run Code Online (Sandbox Code Playgroud)

LAST.Y将出现在该数据集中的第三行,第六行,第九行和第十二行(在Z = 3的每一行上).前两个时间是当Y是大约从1改变为2,并且当它是约从2改变为3.第三时间是当X是即将改变- LAST.Y触发当Y是即将改变或当BY列表中的任何变量更改时.最后,数据集中的最后一行总是最后一行.(无论如何).

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

data want;
set have;
by x y z;
if last.y;
run;
Run Code Online (Sandbox Code Playgroud)

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

data want;
input x y z;
datalines;
1 1 3
1 2 3
1 3 3
2 3 3
;;;;
run;
Run Code Online (Sandbox Code Playgroud)

在末尾.

如果您想了解FIRST和LAST如何运作,您可以做的一件事就是使用PUT _ALL_;.例如:

data want;
set have;
by x y z;
put _all_;
if last.y;
run;
Run Code Online (Sandbox Code Playgroud)

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