在这个数据步骤中,我不明白做什么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;
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 即将变化时触发或当 BY 列表中它之前的任何变量发生变化时。最后,数据集中的最后一行始终是 LAST。(无论如何)。
在上面的特定数据集中,子集 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.(whatever) 和 LAST.(whatever)。(FIRST.Y 和 LAST.Y 实际上是变量。)
在 SAS 中,首先。最后。是在数据步骤中隐式创建的变量。每个变量都有一个第一个。最后一个。对应于 DATA 步中的每条记录。这些值将是 0 或 1。last.y 与 last.y = 1 相同。
请参阅此处了解更多信息。
这是子集 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;