楼主: 人生海海
5187 16

求助如何逐一提取数据集中的日期变量作为下一段程序的宏变量&date [推广有奖]

11
luijb 在职认证  发表于 2010-5-28 17:04:55
为什么一定要认死理呢,下次要用, 再调用call execute就行了,何必硬要设那么多宏变量呢。
call execute是本质也是宏调用,只是你没有看到而已啊。根据你的想法,我写了一段,仅供参考。
/*建立数据集raw,用来生成子数据集的母数据集*/
data raw;
input id rq yymmdd10.;
cards;
1 2009-1-6
2 2009-1-6
3 2009-1-15
4 2009-1-25
5 2009-2-11
6 2009-2-11
7 2009-2-21
8 2009-2-28
9 2009-3-5
10 2009-3-15
11 2009-3-21
12 2009-5-15
13 2009-5-15
;
run;
/*建立数据集rq,用来生成筛选条件,暂且命名为判定数据集*/
data rq;
input id rq yymmdd10.;
cards;
1 2009-1-6
2 2009-1-15
3 2009-1-25
4 2009-2-11
5 2009-2-21
6 2009-2-28
7 2009-3-5
8 2009-3-15
9 2009-3-21
10 2009-5-15
;
run;

%macro creat;
data _null_;
set rq nobs=nobs;/
if _n_=nobs then call symput("nobs",nobs);/*获取判定数据集中有多少条数据*/
%do i=1 %to &nobs;
data _null_;
set rq;
if id=&i ;
call symput("rq&i",rq);/*生成每个日期的宏变量,这里是十个,即&rq1到&rq10从小到排列,你在其他地方可以调用*/
data rq&i;
set raw;
if rq=<"&rq&i";/*调用前面生成的判别时间宏变量*/
run;
%end;
run;
%mend;
%creat;


另外向你说的数据量很大的话,不太建议用这样的方式,用hash要快的多。
西格玛临床统计服务工作室http://www.sigma-stat.com/,luijb@163.com

12
luijb 在职认证  发表于 2010-5-29 11:40:28
根据你的想法,我写了一段,仅供参考。
/*建立数据集raw,用来生成子数据集的母数据集*/
data raw;
input id rq yymmdd10.;
cards;
1 2009-1-6
2 2009-1-6
3 2009-1-15
4 2009-1-25
5 2009-2-11
6 2009-2-11
7 2009-2-21
8 2009-2-28
9 2009-3-5
10 2009-3-15
11 2009-3-21
12 2009-5-15
13 2009-5-15
;
run;
/*建立数据集rq,用来生成筛选条件,暂且命名为判定数据集*/
data rq;
input id rq yymmdd10.;
cards;
1 2009-1-6
2 2009-1-15
3 2009-1-25
4 2009-2-11
5 2009-2-21
6 2009-2-28
7 2009-3-5
8 2009-3-15
9 2009-3-21
10 2009-5-15
;
run;
%macro creat;
data _null_;
set rq nobs=nobs;/
if _n_=nobs then call symput("nobs",nobs);/*获取判定数据集中有多少条数据*/
%do i=1 %to &nobs;
data _null_;
set rq;
if id=&i ;
call symput("rq&i",rq);/*生成每个日期的宏变量,这里是十个,即&rq1到&rq10从小到排列,你在其他地方可以调用*/
data rq&i;
set raw;
if rq=<"&rq&i";/*调用前面生成的判别时间宏变量*/
run;
%end;
run;
%mend;
%creat;

另外像你说的数据量很大的话,不太建议用这样的方式,用hash要快的多。
本文来自: 人大经济论坛 详细出处参考:b] 10# 人生海海
西格玛临床统计服务工作室http://www.sigma-stat.com/,luijb@163.com

13
人生海海 发表于 2010-5-29 15:37:06
朋友,程序运行报错

WARNING: 没有解析符号引用 NOBS。
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: &nobs
ERROR: %TO 值(%DO I 循环中)无效。
ERROR: 宏 CREAT 将终止执行。
ERROR 180-322: 语句无效或未按正确顺序使用。

14
人生海海 发表于 2010-5-29 16:33:48
/*建立数据集raw,用来生成子数据集的母数据集*/
data raw;
input id rq yymmdd10.;
cards;
1 2009-1-6
2 2009-1-6
3 2009-1-15
4 2009-1-25
5 2009-2-11
6 2009-2-11
7 2009-2-21
8 2009-2-28
9 2009-3-5
10 2009-3-15
11 2009-3-21
12 2009-5-15
13 2009-5-15
;
run;
/*建立数据集rq,用来生成筛选条件,暂且命名为判定数据集*/
data rq;
input id rq yymmdd10.;
cards;
1 2009-1-6
2 2009-1-15
3 2009-1-25
4 2009-2-11
5 2009-2-21
6 2009-2-28
7 2009-3-5
8 2009-3-15
9 2009-3-21
10 2009-5-15
;
run;

data _null_;
set rq;
call symput('id',id);
run;

data a;
do id=1 to &id;
set rq;
call symput('date',rq);
%include 'D:\program\spa.sas';
end;
run;


报错
254  %include 'D:\program\spa.sas';
254  %include 'D:\program\spa.sas';
     -
     117
ERROR 117-185: 有 1 个未闭合的 DO 块。




想这样实现也不行,请教高手帮帮忙啊。

15
luijb 在职认证  发表于 2010-5-29 19:24:57
/*建立数据集raw,用来生成子数据集的母数据集*/
data raw;
input id rq yymmdd10.;
cards;
1 2009-1-6
2 2009-1-6
3 2009-1-15
4 2009-1-25
5 2009-2-11
6 2009-2-11
7 2009-2-21
8 2009-2-28
9 2009-3-5
10 2009-3-15
11 2009-3-21
12 2009-5-15
13 2009-5-15
;
run;
/*建立数据集rq,用来生成筛选条件,暂且命名为判定数据集*/
data rq;
input id rq yymmdd10.;
cards;
1 2009-1-6
2 2009-1-15
3 2009-1-25
4 2009-2-11
5 2009-2-21
6 2009-2-28
7 2009-3-5
8 2009-3-15
9 2009-3-21
10 2009-5-15
;
run;
data _null_;
set rq nobs=nobs;
if _n_=nobs then call symput("nobs",nobs);/*获取判定数据集中有多少条数据*/
run;
%macro creat;
%do i=1 %to &nobs;
data _null_;
set rq;
if id=&i ;
call symput("rq&i",rq);/*生成每个日期的宏变量,这里是十个,即&rq1到&rq10从小到排列,你在其他地方可以调用*/
data rq&i;
set raw;
if rq=<"&rq&i";/*调用前面生成的判别时间宏变量*/
run;
%end;
run;
%mend;
%creat;

把顺序调整一下就行了
西格玛临床统计服务工作室http://www.sigma-stat.com/,luijb@163.com

16
人生海海 发表于 2010-5-29 21:29:50
14# 人生海海


谢谢!已经能够解决部分问题了。
请问对这个问题有什么好的建议吗?

17
soporaeternus 发表于 2010-5-29 22:56:22
我偏向于8楼的方法......
虽然我不知道楼主要干什么,但是觉得按日期生成数据集,并且要上千个,是不是可以改变数据存储方式来优化
Let them be hard, but never unjust

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 14:30