楼主: zwnSAS121
1508 2

[程序分享] 有条件分割输出数据集 [推广有奖]

  • 6关注
  • 2粉丝

博士生

19%

还不是VIP/贵宾

-

威望
0
论坛币
294 个
通用积分
2.0010
学术水平
13 点
热心指数
16 点
信用等级
13 点
经验
2473 点
帖子
112
精华
0
在线时间
330 小时
注册时间
2015-12-18
最后登录
2020-8-29

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. /*问题:分割输出f4连续等于1的数据集*/
  2. data test;
  3. input f1 f2 f3 f4 ;
  4. obs=_N_;
  5. cards;
  6. 2   3    6    0
  7. 3   2    2    1
  8. 6   7    7    1
  9. 4   4    4    0
  10. 5   5    6    1
  11. 2   3    3    1
  12. 8   8    9    1
  13. 7   7    7    0
  14. ;
  15. proc sql;/*sql语句找出f4=0的选项以及观测数*/
  16. create table test1 as
  17. select *
  18. from test
  19. where f4=0
  20. group by obs;
  21. quit;

  22. data test2;
  23. set test1;
  24. lag_obs=lag(obs);/*利用lag函数构造f4=1的连续区间上限与下限*/
  25. if _n_>1 and obs-lag_obs gt 1;
  26. datanum+1;/*构造数据集个数*/
  27. run;

  28. data test3(keep=datanum lower upper);/*重命名便于识别变量含义*/
  29. retain datanum lower upper;
  30. set test2(rename=(lag_obs=lower obs=upper));
  31. run;

  32. data _null_;
  33. set test3;/*利用test3构造好的数据条件来执行call execute*/
  34. call execute('data wanted_'||compress(datanum)||';
  35. set test;
  36. where '||compress(lower)||' < obs < '||compress(upper)||';
  37. keep f1-f4;
  38. run;');
  39. run;

  40. /*call execute单引号里面等价于以下程序*/
  41. data wanted_'||compress(datanum)||';/*取数据集个数编号*/
  42. set test;
  43. where '||compress(lower)||' < obs < '||compress(upper)||';
  44. keep f1-f4;/*利用test3数据集里面的数据条件限制test数据集的obs*/
  45. run;/*当然,此程序参考了前一位大神的思路,只是稍作修改,便于理解*/
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据集 compress proc sql EXECUTE wanted

已有 2 人评分经验 热心指数 收起 理由
prince315 + 100 + 1 精彩帖子
李会超 + 100 精彩帖子

总评分: 经验 + 200  热心指数 + 1   查看全部评分

沙发
prince315 在职认证  发表于 2017-1-17 10:27:44 |只看作者 |坛友微信交流群
  1. data test;
  2. input f1 f2 f3 f4 ;
  3. cards;
  4. 2   3    6    0
  5. 3   2    2    1
  6. 6   7    7    1
  7. 4   4    4    0
  8. 5   5    6    1
  9. 2   3    3    1
  10. 8   8    9    1
  11. 7   7    7    0
  12. ;
  13. run;

  14. data test2;
  15. set test;
  16. by notsorted f4 ;
  17. retain dsn 0;
  18. if first.f4 then dsn + 1;
  19. run;
复制代码


这样就根据f4的连续取值分为不同组;然后再根据dsn的取值及比如f4是否为1等条件做后续处理,如输出到不同dataset中即可。

使用道具

藤椅
zwnSAS121 发表于 2017-1-17 10:42:57 |只看作者 |坛友微信交流群
prince315 发表于 2017-1-17 10:27
这样就根据f4的连续取值分为不同组;然后再根据dsn的取值及比如f4是否为1等条件做后续处理,如输出到不 ...
这样得到test2数据集也可以

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 11:04