第一个和最后一个功能sas

时间:2016-07-05 10:01:07

标签: sas datastep

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

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;

每当“活动”返回“活动1”时,基本上变量'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;

我有一个'计数',每当新的'活动'出现在某个'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或更高。我相信我之前有过这方面的工作,但我无法解决我所改变的问题。

有人能帮忙解决这个问题吗?

谢谢,

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

输入数据:

data example1;
   attrib Activity format = $20.
         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

enter image description here

答案 2 :(得分:0)

您错过了retain声明。每次datastep循环时,变量都会被重置。 Retain会抑制此行为。

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