使用 SAS 中的下一个记录值更新当前记录

Update current record with next record value in SAS

我想确定代理工作的时间范围。 例如 Agent 081 从 202012-202104 有一个任务 aaa,然后它从 202104 切换到任务 vvv 直到现在 202202.

我找到了这段代码:

    data want;
recno=_n_+1;
set Task_times end=last;
if not last
then set Task_times (keep=TIME_ID rename=(TIME_ID=TO)) point=recno;
else call missing(TO);
run;

输出如下:

OUTPUT

这不是我想要的,我还需要检查代理。

有谁知道如何添加一个额外的条件来检查下一行的代理是否相同?

谢谢。

许多问候, 本

听起来您想使用 AGENT 作为 BY 变量。

不需要使用POINT=选项,你可以设置从第二个观察开始的数据集。您可以通过在末尾添加一个额外的空观察来防止数据步骤停止得太快,方法是包括另一个具有一个观察且没有变量的数据集。

使用 BY 组处理来决定何时忽略从下一次观察中检索到的值。

示例如下:

data have;
  input agent time_id a_type $ ;
cards;
80 202012 aa
80 202104 bb
83 202012 cc
83 202102 dd
;

data want;
  set have;
  by agent;
  set have(firstobs=2 keep=time_id rename=(time_id=to)) have(obs=1 drop=_all_);
  if last.agent then call missing(to);
run;

结果

Obs    agent    time_id    a_type      to

 1       80      202012      aa      202104
 2       80      202104      bb           .
 3       83      202012      cc      202102
 4       83      202102      dd           .

我使用了你的代码并得到了这个结果:

OUTPUT

我需要的输出是:

Result

这个宏可能会有帮助 - 它不会向您显示下一条记录,但它确实允许您调用任何以前的记录:https://core.sasjs.io/mp__prevobs_8sas.html