【发布时间】:2014-04-04 14:37:19
【问题描述】:
我习惯于在 MatLab 中编码,使用 Do Loops 时 SAS 对我来说还是个新手。我的目标是检查当前行上方/之前的行,以查看当前行号和上一个行号是否匹配。如果第一行上方的矢量数据与当前行匹配,我希望能够检查这一点。
Num(列向量)= 123,123,134,156,290,348,596,569,569
/*---- Do-Loop ----*/
data full;
set work.Test;
count=_N_;
do i=1 to count;
Current = Num(i);
Prev = Num(i-1);
end;
run;
对我来说,“Current”应该引用向量“Num”的第 i 个单元格,而“Prev”应该引用“Current”单元格之前的第 i 个单元格。有人可以帮帮我吗?
【问题讨论】:
-
检索前一个观察值(行)的函数是
lag()。所以你会使用current=num; prev=lag(num);。在 SAS 表中引用“单元格”会使事情变得混乱,数据按变量和观察值排列(分别类似于列和行)。 -
那么检索下一个观察值(行)怎么样,该函数会被调用什么?
-
那就是
lead() -
lead()在基本 SAS 中不存在,lag()不会精确访问前一行的数据。它可以像在某些情况下那样使用,但在这种情况下,最好不要使用它。特别是,它在条件语句中不会按照您期望的方式工作,因此如果您出于某种原因使用lag,则应小心无条件地分配 prev。 -
公平点@Joe,我一定把它与 SQL 的非 SAS 变体中存在的
lead()混淆了。我也会回应对lag()的保留意见,我会尽可能避免它。