第一个和最后一个函数 sas

First and last function sas

我有一些数据看起来像这样

data example1;     
   input Activity $ logflag;
   Activity1 1
   Activity2 1
   Activity3 1
   Activity4 1
   Activity1 2
   Activity2 2
   Activity3 2
   Activity1 3
   Activity2 3
   Activity3 3
   Activity4 3
   Activity1 4
   Activity2 4
   ; 
run;

基本上每次从 'Activity' returns 到 'Activity1' 时变量 'logflag' 都会递增 1,但是我想做到这一点;

data example2;     
   input Activity $ logflag count;
   Activity1 1 1
   Activity2 1 2
   Activity3 1 3
   Activity4 1 4
   Activity1 2 1
   Activity2 2 2
   Activity3 2 3
   Activity1 3 1
   Activity2 3 2
   Activity3 3 3
   Activity4 3 4
   Activity1 4 1
   Activity2 4 2
   ;
run;

我有一个 'count',每当新的 'Activity' 出现在某个 'logflag'.

中时,它就会递增 1

我用的是这个;

data AS2.TENMAY_EXAMPLE4;
  set AS2.TENMAY_SESSIONID;
  by logflag Activity notsorted;
  if first.logflag then count=0;
  if first.Activity then count+1;
run;

我得到了这个

data example2;     
   input Activity $ logflag count;
   Activity1 1 1
   Activity2 1 2
   Activity3 1 2
   Activity4 1 2
   Activity1 2 1
   Activity2 2 2
   Activity3 2 2
   Activity1 3 1
   Activity2 3 2
   Activity3 3 2
   Activity4 3 2
   Activity1 4 1
   Activity2 4 2
   ;
run;

我无法理解的是为什么计数器递增 1 然后变为 2 但永远不会达到 3 或更高。我确信我以前有过这个工作,但我无法弄清楚我所做的更改。

有人可以帮忙吗?

谢谢,

输入数据:

data example1;
   attrib Activity format = .
         logflag  format = 8.;
   input Activity $ logflag;
   Activity1 1
   Activity2 1
   Activity3 1
   Activity4 1
   Activity1 2
   Activity2 2
   Activity3 2
   Activity1 3
   Activity2 3
   Activity3 3
   Activity4 3
   Activity1 4
   Activity2 4
   ; 
run;

要得到你想要的结果试试这个:

data example2;
   set example1;
   by logflag Activity notsorted;
   if first.logflag then count=1;
   else count+1;
run;

结果是:

Activity   logflag  count
---------  -------  -----
Activity1  1        1
Activity2  1        2
Activity3  1        3
Activity4  1        4
Activity1  2        1
Activity2  2        2
Activity3  2        3
Activity1  3        1
Activity2  3        2
Activity3  3        3
Activity4  3        4
Activity1  4        1
Activity2  4        2

您缺少 retain 语句。每次数据步循环时,变量都会被重置。 Retain 抑制这种行为。

data AS2.TENMAY_EXAMPLE4;
  set AS2.TENMAY_SESSIONID;
  retain count;
  by logflag Activity notsorted;
  if first.logflag then count=0;
  count+1;
run;

您的输入数据集中必须已经有一个名为 COUNT 的变量。 因此,每次 SET 语句运行输入数据集中的值都会覆盖上一次观察的值。

为了得到你的例子,那么每次观察的 COUNT 可能是 1。因此,当您在 ACTIVITY 更改时递增时,它变为 2。每个 LOGFLAG 组的第一个观察值是 1,因为您在递增之前首先将其设置为 0。