我有一个大块来引导数据集。
%let iter = 2;
%let seed = 777;
data work.seg;
input segment $3. prem loss;
datalines;
AAA 5000 0
AAA 3000 12584
AAA 200 245
AAA 500 678
;
data work.test;
do i=1 to &iter;
sumprem=0;
do _n_=1 to 1000000 until (sumprem>=8700);
row_i=int(ranuni(&seed)*n)+1;
set work.seg point=row_i nobs=n;
sumprem + prem;
output;
end;
end;
stop;
run;
可以,但是我有几个问题。
(sumprem >= 8700)
成为(sumprem >= &threshold)
,其中&threshold
是prem
列的总和。&seed
的方式是否正确?还是应该用(&seed)
之类的东西来代替(&seed + _n_)
?如何使最后一个数据步进入宏...如下所示,但是我什么都没做。
%macro boot(data, iter, seed);
%do i=1 %to &iter;
sumprem=0;
%do _n_=1 %to 1000000 %until (sumprem>=8700);
row_i=int(ranuni(&seed)*n)+1;
set work.seg point=row_i nobs=n;
sumprem + prem;
output;
%end;
%end;
%mend;
答案 0 :(得分:0)
我假设您想从work.seq中计算prem之和?
proc sql noprint ;
select sum(prem) format=best32. into :threshold trimmed from seg ;
quit;
您的宏代码是令人困惑的宏逻辑,可用于生成代码,而数据步逻辑是对实际数据进行操作的逻辑。要使其成为宏,只需对宏的参数名称使用相同的宏变量名称,并保留相同的代码即可。
%macro boot(in,out, iter, seed);
data &out;
do until (eof);
set &in end=eof;
threshold + prem ;
end;
do i=1 to &iter;
sumprem=0;
do _n_=1 to 1000000 until (sumprem>=threshold);
row_i=int(ranuni(&seed)*n)+1;
set &in point=row_i nobs=n;
sumprem + prem;
output;
end;
end;
stop;
run;
%mend boot;