楼主: JasonKQiao
6943 12

[原创博文] SAS数据集按照观测拆分,利用宏 [推广有奖]

  • 0关注
  • 1粉丝

硕士生

33%

还不是VIP/贵宾

-

威望
0
论坛币
302 个
通用积分
0.1500
学术水平
1 点
热心指数
0 点
信用等级
0 点
经验
1471 点
帖子
93
精华
0
在线时间
59 小时
注册时间
2010-10-3
最后登录
2023-5-7

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
如题,鄙人想按照变量date的值来拆分数据集
如date=19960131生成一个数据集,date=19960228生成一个
现在有很多个,到20080731了
每月一个
所有想用一个宏来操作
不知道如何进行
O(∩_∩)O谢谢
二维码

扫码加我 拉你入群

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

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

关键词:sas数据集 数据集 date ATE 不知道 如何

回帖推荐

456852 发表于5楼  查看完整内容

思路是先把distinct date的值变为宏变量,然后用data步输出。 比如说如下这段code: data a; do date=1991 to 2011; output; end; run; data _null_; set a end=last; call symputx('date'||left(_n_),date); if last then call symput ('n',_n_); run; %macro split; %do i=1 %to &n; data b&i; set a; where date=&&date&i; run; %end; %mend; %split;

本帖被以下文库推荐

沙发
stata18 发表于 2011-6-6 20:32:52 |只看作者 |坛友微信交流群
这个似乎不是太难。

使用道具

藤椅
stata18 发表于 2011-6-6 20:33:31 |只看作者 |坛友微信交流群
只是怎么写一个简单的宏程序,还是要化些功夫。

使用道具

板凳
JasonKQiao 发表于 2011-6-6 20:45:50 |只看作者 |坛友微信交流群
求宏啊,O(∩_∩)O谢谢

使用道具

报纸
456852 发表于 2011-6-7 03:21:33 |只看作者 |坛友微信交流群
思路是先把distinct date的值变为宏变量,然后用data步输出。
比如说如下这段code:
data a;
do date=1991 to 2011;
output;
end;
run;
data _null_;
set a end=last;
call symputx('date'||left(_n_),date);
if last then call symput ('n',_n_);
run;
%macro split;
%do i=1 %to &n;
data b&i;
set a;
where date=&&date&i;
run;
%end;
%mend;
%split;
已有 2 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子
李会超 + 80 精彩帖子

总评分: 经验 + 83  论坛币 + 3   查看全部评分

使用道具

地板
soporaeternus 发表于 2011-6-7 08:59:16 |只看作者 |坛友微信交流群
楼上用if吧,这样只读原表一次,如果是股票类高频数据,一次循环一个data步还是会很慢
Let them be hard, but never unjust

使用道具

7
天堂之路 发表于 2012-8-17 09:19:49 |只看作者 |坛友微信交流群
对,会非常慢的

使用道具

8
chenys625 发表于 2012-8-17 13:46:16 |只看作者 |坛友微信交流群
用sas生产一段if output的代码就好了 很容易的!

使用道具

9
YueweiLiu 发表于 2012-8-17 15:00:25 |只看作者 |坛友微信交流群
这种情况我推荐使用call execute语句,用不着宏,不过要看你的具体情况,我假设楼主需要生成数据的日期都在一个数据集里,对另外一个数据集进行拆分,可如下折腾:
  1. data date;
  2.         date=input("19960131",yymmdd8.);
  3.         output;
  4.         date=input("19960228",yymmdd8.);
  5.         output;
  6.         date=input("19960309",yymmdd8.);
  7.         output;
  8. run;

  9. data _null_;
  10.         set have;
  11.         call execute ("data data_"||strip(put(date,yymmddn8.))||";set YOURDATA;if date="||date||";run;");
  12. run;
复制代码
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
mengyuy + 1 + 1 + 1 精彩帖子
李会超 + 80 精彩帖子

总评分: 经验 + 80  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

10
maidenhan 发表于 2012-8-17 15:43:58 |只看作者 |坛友微信交流群
Here is my way.
  1. data a;
  2. format target_day $8.;
  3. input target_day $;
  4. cards;
  5. 20120730
  6. 20120731
  7. 20120810
  8. 20120817
  9. ;run;
  10. %macro segmentation();
  11. proc sort data = a out = work.t1(keep = target_day) nodupkey;
  12. by target_day;
  13. run;
  14. data _null_;
  15. set work.t1 nobs=n;
  16. call symputx(compress("set_"||_n_), put(input(target_day, yymmdd8.), yymmddn8.));
  17. if _n_ = 1 then call symputx('n',n);
  18. run;
  19. data %do ii = 1 %to &n.;
  20.   data_&&set_&ii..
  21.   %end;;
  22. set a;
  23. select (target_day);
  24.   %do ii = 1 %to &n.;
  25.    when ("&&set_&ii..") output data_&&set_&ii..;
  26.   %end;
  27.   otherwise;
  28. end;
  29. run;
  30. proc sql;
  31. drop table work.t1;
  32. quit;
  33. %mend;
  34. %segmentation();
复制代码

已有 1 人评分经验 收起 理由
李会超 + 80 精彩帖子

总评分: 经验 + 80   查看全部评分

使用道具

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

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

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

GMT+8, 2024-4-20 00:07