- /*问题:分割输出f4连续等于1的数据集*/
- data test;
- input f1 f2 f3 f4 ;
- obs=_N_;
- cards;
- 2 3 6 0
- 3 2 2 1
- 6 7 7 1
- 4 4 4 0
- 5 5 6 1
- 2 3 3 1
- 8 8 9 1
- 7 7 7 0
- ;
- proc sql;/*sql语句找出f4=0的选项以及观测数*/
- create table test1 as
- select *
- from test
- where f4=0
- group by obs;
- quit;
- data test2;
- set test1;
- lag_obs=lag(obs);/*利用lag函数构造f4=1的连续区间上限与下限*/
- if _n_>1 and obs-lag_obs gt 1;
- datanum+1;/*构造数据集个数*/
- run;
- data test3(keep=datanum lower upper);/*重命名便于识别变量含义*/
- retain datanum lower upper;
- set test2(rename=(lag_obs=lower obs=upper));
- run;
- data _null_;
- set test3;/*利用test3构造好的数据条件来执行call execute*/
- call execute('data wanted_'||compress(datanum)||';
- set test;
- where '||compress(lower)||' < obs < '||compress(upper)||';
- keep f1-f4;
- run;');
- run;
- /*call execute单引号里面等价于以下程序*/
- data wanted_'||compress(datanum)||';/*取数据集个数编号*/
- set test;
- where '||compress(lower)||' < obs < '||compress(upper)||';
- keep f1-f4;/*利用test3数据集里面的数据条件限制test数据集的obs*/
- run;/*当然,此程序参考了前一位大神的思路,只是稍作修改,便于理解*/