如何计算SAS中非零序列的长度

时间:2019-03-21 20:38:07

标签: sas

我想计算数据中非零序列的长度,如下所示:

ID  Value  
1     0  
1     0  
1     2.5  
1     3  
1     0  
1     4  
1     2  
1     5  
1     0  

因此,这里的第一个非零序列的长度为2,第二个非零序列的长度为3。新数据将如下所示:

ID  Value  Length  
1     0    0  
1     0    0  
1     2.5  2   
1     3    2  
1     0    0  
1     4    3  
1     2    3  
1     5    3   
1     0    0  

我该如何编写SAS代码以使用像这样的大数据来完成此任务。谢谢!

1 个答案:

答案 0 :(得分:0)

这是一种可能的解决方案。它假定Value变量中没有缺失值,并且您的ID变量对此问题没有任何意义。

*creates new length variable that starts at 1 and increments by 1 from start to end of every non-zero sequence;
data step_one (drop=prev_val);
   set orig_data;
   retain prev_val length 0;
   indx = _n_;
   if value ne 0 and prev_val ne 0 then length = length + 1;
   else if value ne 0 then length = 1;
   else if value = 0 then length = 0;
   prev_val = value;
run;

*sorts dataset in reverse order;
proc sort data=step_one;
   by descending indx;
run;

*creates modified length variable that carries maximum length value for each sequence down to all observations included in that sequence;
data step_two (drop=length prev_length rename=(length_new=length));
   set step_one;
   retain length_new prev_length 0;
   if length = 0 then length_new = 0;
   else if length ne 0 and prev_length = 0 then
      length_new = length;
   prev_length = length;
run;

*re-sorts dataset back to its original order and outputs final dataset with just the needed variables;
proc sort data=step_two out=final_result (keep=ID value length);
   by indx;
run;