首页 > 解决方案 > 如果在特定条件下,前一行值与当前标志不匹配,则 SAS 将 1 添加到标志

问题描述

我有一个正在创建的表,我们会说第 1 列是 YearMonth,第 2 列是标志。

年月旗
200101 1
200102 1        
200103 0
200104 1
200105 1
200106 0
200107 1
200108 0

注意:标志列的第一个条目将始终为 1。

如果当前标志与前一行值以及一个主要条件不匹配,我想将 1 添加到标志(在输出后进行解释以获得更好的解释)。

输出应该是:

年月旗阶段
200101 1 1
200102 1 1    
200103 0 2
200104 1 3
200105 1 3
200106 0 4
200107 1 3
200108 0 4

请注意,只有 4 个阶段。因此,如果一个标志在第 4 阶段之后重复,那么它不应该增加,并且应该在标志 = 1 时作为阶段 = 3 或在标志 = 0 时作为阶段 = 4 给出输出。

我正在尝试这样的事情:


 data one;
 set Query;
 Stage=lag(flag);
 if first.flag then Stage=1;
 if first.flag then Stage=1;
 if flag ne Stage+1 then Stage=Stage+1;
 run;

解释为什么此代码不起作用会非常有帮助。谢谢!

另外,我知道一旦达到第 4 阶段,我就不会做任何事情。

标签: sassas-macro

解决方案


这本质上是对观察组进行计数。所以使用 BY 组处理。在 BY 语句中添加 NOTSORTED 关键字,这样 SAS 就不会抱怨这些值没有排序。开始新组时增加计数器。

data want;
  set have;
  by flag notsorted;
  stage + first.flag;
run;

要添加您的第二个条件,您只需添加此行

  stage = min(stage,4 - flag);

推荐阅读