Sas 如果前一行值不为';在特定条件下与当前标志不匹配

Sas 如果前一行值不为';在特定条件下与当前标志不匹配,sas,sas-macro,Sas,Sas Macro,我有一个正在创建的表,我们会说第1列是YearMonth,第2列是Flag YearMonth Flag 200101 1 200102 1 200103 0 200104 1 200105 1 200106 0 200107 1 200108 0 解释一下为什么这段代码不起作用会很有帮助。谢谢大家! 此外,我意识到,一旦到达阶段4,我就不会做任何事情。隐式循环的迭代之间需要保留阶段值。隐式retain将伴随使用语法为+的sum语句

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

YearMonth Flag 200101 1 200102 1 200103 0 200104 1 200105 1 200106 0 200107 1 200108 0 解释一下为什么这段代码不起作用会很有帮助。谢谢大家!


此外,我意识到,一旦到达阶段4,我就不会做任何事情。

隐式循环的迭代之间需要保留
阶段
值。隐式
retain
将伴随使用语法为
+的
sum
语句

例如:

data have; input 
YearMonth Flag; datalines;
200101    1
200102    1
200103    0
200104    1
200105    1
200106    0
200107    1
200108    0
;

data want(drop=maxstage_reached);
  set have;
  
  if flag ne lag(flag) then stage+1;                * increment per rules;

  if stage = 4 then maxstage_reached=1;             * tracking flag (retained);

  if maxstage_reached then stage = 4 - flag;        * special rule;

  retain maxstage_reached;
run;

这基本上是计算观察组的数量。所以使用分组处理。在BY语句中添加NOTSORTED关键字,这样SAS就不会抱怨值没有排序。启动新组时递增计数器

data want;
  set have;
  by flag notsorted;
  stage + first.flag;
run;
要添加第二个条件,您只需添加这一行即可

  stage = min(stage,4 - flag);

谢谢如果flag列的第一个条目不等于1怎么办?是否有一种方法可以设置如下内容:如果第一个条目不是1(即,它将是0),那么阶段将被分配为2,并且相同的计算将跟随它?如果
如果_n_=1,则可以添加第一个,然后阶段=1-标志设置初始值如果对许多不同的用户ID重复相同的计算,即使我使用“by”,代码是否有任何原因不起作用?我这样问是因为我刚刚意识到,对于不同的用户ID,存在不同的条件。抱歉在提问时没有说清楚。请将最佳答案切换到@Tom,并使用
by id标志notsorted;如果第一个id,则调用缺失(阶段)重置每个id开始时的阶段值。
data want;
  set have;
  by flag notsorted;
  stage + first.flag;
run;
  stage = min(stage,4 - flag);