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;