SAS计算一个相等数字的序列

时间:2016-05-30 13:28:33

标签: sas

我希望以相同数字的顺序得到最后一个数字。例如,我有以下数据集:

  

X

     

1

     

1

     

0

     

0

     

0

     

1

     

1

     

0

鉴于数字序列,我需要提取“一个”序列的最后一个数字,直到看起来为0.这就是我想要的:

  

X Seq

     

1 1

     

1 2

     

1 3

     

0 1

     

0 2

     

0 3

     

1 1

     

1 2

     

0 1

     

1 1

     

1 2

     

1 3

     

0 1

我需要创建一个新数据集,其数字以粗体显示,即:

  

SEQ1

     

3

     

2

     

3

感谢您的任何建议。

4 个答案:

答案 0 :(得分:0)

在此处使用带有notsorted选项的proc摘要:

data math;
input x;
datalines;
1
1
1
0
0
0
1
1
0
1
0
1
1
1
1
0
1
;
run;

proc summary data=math;
by x notsorted;
class x;
output Out=z;
run;

data z (drop=_type_ x);
set z (rename=(_FREQ_=COUNT));
where _type_=1 and x=1;/*if you are looking for other number then 1, replace it here*/
run;
proc print data=z noobs;
run;

结果是:

enter image description here

答案 1 :(得分:0)

您可以使用延迟创建组变量,然后保留您创建的每个组的最后一次观察:

data temp;
   input x $;
   datalines;
    1
    1
    1
    0
    0
    0
    1
    1
    0
    1
    1
    1
    0
    ;
run;

data temp2;
    set temp;
    retain flag;
    if lag(x) > x then flag = _n_;
    if x = 0 then delete;
run;

data temp3 (keep = seq1);
    set temp2;
    seq1 + 1;
    by flag;
    if first.flag then seq1 = 1;
    if last.flag then save = 1;
    if missing(save) then delete;
run;

答案 2 :(得分:0)

这是一个只使用一个带保留语句的数据步骤的解决方案。

data have;
  input x @@;
  output;
  datalines;
1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1
;

data want(keep = count);
  set have end = last;
  retain x_previous . count .;

  if x = 0 then do;
    if x_previous = 1 then do;
      output;
      count = 0;
    end;
  end;

  else if x = 1 then count + 1;

  if last = 1 and count > 0 then output;

  x_previous = x;
run;

结果

count
-----
3
2
1
4
1

答案 3 :(得分:0)

还有一个选项 - 使用NOTSORTED BY组选项。

Data want;
Set have;
 By x NOTSORTED;

 Retain count;

 If first.x then count=1;
 Else count+1;

 If last.x then output;

 Keep count;
 Run;