Sas 使用LAG和LAST.VAR创建变量

Sas 使用LAG和LAST.VAR创建变量,sas,Sas,我有以下数据集: AGE HSQ PCT 65 1 0.7 65 2 0.2 65 3 0.1 66 1 0.5 66 2 0.25 66 3 0.25 [...] 我需要的是获得以下输出: AGE P1 P2 P3 65 0.7 0.2 0.1 66 0.5 0.25 0.25 [...] 有人告诉我要采

我有以下数据集:

AGE    HSQ    PCT

65      1     0.7
65      2     0.2
65      3     0.1
66      1     0.5
66      2     0.25
66      3     0.25

[...]
我需要的是获得以下输出:

AGE     P1    P2     P3

65     0.7    0.2    0.1
66     0.5    0.25   0.25

[...]
有人告诉我要采用
LAG
FIRST.AGE
LAST.AGE
这样做,对我来说这似乎是一个好策略。但是我不能得到最后的结果。。我使用的(错误)代码是:

DATA OUTPUT;
  SET SAMPLE;
    BY AGE HSQ;
  IF LAST.AGE THEN DO;
    P1=LAG2(PCT);
    P2=LAG1(PCT);
    P3=PCT;
  END;
RUN;

但它跳到了previus年龄百分比,这不是我需要的。。语法错误在哪里?谢谢

被告知这是一项使用它们的任务,或者这是最简单的方法

最简单的方法是PROC转置:

data have;
input AGE    HSQ    PCT;
datalines;
65      1     0.7
65      2     0.2
65      3     0.1
66      1     0.5
66      2     0.25
66      3     0.25
;;;;
run;

proc transpose data=have out=want prefix=P;
by age;
var pct;
id hsq;
run;
LAG的工作方式与您认为的不一样—它不会给您上一行的值;它将创建一个队列,并获取(参数)的当前值,并为您提供队列上的前一个值。所以你不能在这样的IF语句中使用它

如果出于某种原因必须在datastep中执行此操作,那么您可能希望这样做:

data want;
array p[3];
do _n_ = 1 by 1 until (last.age);
    set have;
    by age;
    p[hsq]=pct;
end;
keep p1-p3 age;
run;
真的没有理由使用滞后,或任何滞后的概念;正如您遇到属于某个位置的值一样,您将它们分配给该位置,当您点击last.age时,然后输出


有人想和我一起加入SASware请求删除滞后功能吗

只是为了好玩,对原始问题的直接回答(展示如何做到这一点):

这需要花费大量额外的工作(当然,我指的是几纳秒的CPU时间),因为它计算滞后六次,只输出两个结果。这也有点“风险”,因为它不会检查以确保HSQ是正确的值-也就是说,如果你错过了一个年龄段的一个条目,并且只有两行,那么你会有上一个年龄段的HSQ=3的P1值,这可能是不需要的


最后一点是,对于LAG,如果您确实打算将其用作“前一行的记录”的替代,则需要将其保留在条件块之外。计算每行的延迟,并有条件地使用结果(在本例中,有条件地使用输出)。

好吧,我只需要获得最终结果,因此转置选项看起来更优雅,更不容易出错。在互联网上做了一些研究之后,我同意LAG不是一个容易理解的函数,特别是对于初学者来说。。非常感谢你的帮助!乔,我几乎和你在一起了!不幸的是,在少数情况下,滞后是有用的。例如-2行之前(
lag2
)或3行之前(
lag3
)的值,等等。此外,如果希望保留行中的每个值,则延迟可能更容易。除此之外,我完全同意这是一个使用过度的函数。不幸的是,我认为这是因为滞后概念在统计中被大量使用。如果他们修复了滞后函数,使其捕获值,而不管它是否位于
If
执行分支中,我认为这将大大有助于弥补它。只是澄清一下-我上面的评论是从使用它从前几行捕获数据的角度出发的,而不是出于预期目的使用它,正如您所指出的,这是为了提供排队功能。如果您想从两行之前获取值,请将数据集合并到自身,或使用点(随机访问),或执行任何其他可以正确获取的操作。在访问其他行时,LAG和LAGn几乎从来都不是正确的答案。对LAG的正确“修复”是将其重命名为队列,并阻止人们认为它不是一个函数…+1用于提及DOW循环数据步骤选项。根据我的经验,这比proc transpose快得多,并且在需要转置多个变量时可以更好地扩展。再次感谢,这消除了我最后对滞后的疑虑。在这种情况下,缺少值肯定会导致错误的输出。。对于对这里感兴趣的人,有一个pdf作为您关于处理条件块的观点的基础:
DATA want;
  SET have;
    BY AGE HSQ;
    p1=lag2(pct);
    p2=lag1(pct);
    p3=pct;
    if last.age then output;
run;