计算数据步骤中的连续出现次数

时间:2015-04-20 04:27:33

标签: sas

Pos Series Res
--- ------ ---
A   1      1
A   1      1
A   1      0
A   1      -1
.
.
B   3      1
B   3     -1

只有Res的可能值为1,0,-1。我的目标是计算每个系列K1的连续-1次出现次数,其中K由用户定义。

例如: 1 1 -1 1 1 1 0 0 1

K = 2,输出为3

K = 3,输出为1

K > 3,输出为0

问题

如果k是固定的,那么我可以使用lag来完成。但我不知道如何用动态k处理这个问题。

data Want;
   set Have;
   prev1 = lag1(Res);
   prev2 = lag2(Res);
   prev3 = lag3(Res);
   if first.Pos  or Series = 1 then call missing(prev1,prev2,prev3);
   if Series = 2 then call missing(prev2,prev3);
   if Series = 3 then call missing(prev3);
   N = sum(of prev:);
run;

proc sql noprint;
   select count(*), N
   from WANT
   group by N;
quit;

1 个答案:

答案 0 :(得分:3)

最简单的方法是不使用滞后。

data have;
input Pos $ Series Res;
datalines;
A   1      1
A   1      1
A   1      0
A   1      -1
A   1      1
A   1      1
A   1      1
A   1      0
B   3      1
B   3     -1
B   3      1
B   3      1
;;;;
run;

%let k=2;
data want;
  set have;
  array inRow[-1:1] seriesM1 seriesZero seriesP1;
  by pos series res notsorted;
  if first.res then consec=0;
  if first.series then do;
    inRow[-1]=0;
    inRow[1]=0;
  end;
  consec+1;
  if consec >= &k and res ne 0 then inRow[res]+1;
  if last.series then output;
run;

我在这里假设你如何连续处理' k'行数较长,但它应该给出合理假设的正确答案(对于任何M> K,你有(M-K)+1 K-in-a行)。

基本上,您可以使用带有NOTSORTED的BY语句来计算变量中的运行,因为如果它是NOTSORTED,它将重置为FIRST。无论这些值的顺序如何,每次达到新值。所以你充分利用了这一点,tada,你知道到目前为止你已经看过多少次。然后将其与k进行比较,然后重新设置。