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
。我的目标是计算每个系列K
或1
的连续-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;
答案 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
进行比较,然后重新设置。