【问题标题】:What does this if mean in a data step?如果在数据步骤中这意味着什么?
【发布时间】:2013-01-14 13:32:13
【问题描述】:

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

【问题讨论】:

    标签: sas datastep


    【解决方案1】:

    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 中的 first 和 last 到底是什么?某种物体?如果我尝试执行 a.b = 6; 之类的操作,则会收到错误 Variable a is not an object.
    • First.(variable) 和 last.(variable) 是使用 BY 语句时自动创建的特殊变量。为什么他们使用点符号我不知道。点表示法也用于其他一些事物(例如散列对象),但 SAS 在这方面并不是非常一致。
    • @Joe:在last.y 之后回答我的问题(这可能会发生多次,我确信这一点)下一个 if 块被执行,否则(如果不是last.y) .正确吗?
    • 如果 last.y 那么你将继续执行并最终输出一行。如果不是(last.y),那么您将立即停止执行并继续进行下一个观察而不输出一行。我想这就是你要说的,所以,是的。
    【解决方案2】:

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

    更多信息请参考这里info。

    【讨论】:

      【解决方案3】:

      这是子集 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 2016-06-28
        • 2019-08-07
        • 2010-10-21
        • 2016-05-18
        • 1970-01-01
        相关资源
        最近更新 更多