在这个数据步骤中,我不明白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;
答案 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;