2

在这个数据步骤中,我不明白做什么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;
4

3 回答 3

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 即将变化时触发或当 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 实际上是变量。)

于 2013-01-14T14:41:34.080 回答
0

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

请参阅此处了解更多信息

于 2015-11-13T20:29:58.997 回答
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;
于 2015-11-13T22:09:35.790 回答