如何在SAS中为宏构建循环?
我想在SAS中做一个基于宏的模拟。我可以构建一个名为“fine()”的函数,代码如下如何在SAS中为宏构建循环?,sas,Sas,我想在SAS中做一个基于宏的模拟。我可以构建一个名为“fine()”的函数,代码如下 DATA CLASS; INPUT NAME $ SEX $ AGE HEIGHT WEIGHT; CARDS; ALFRED M 14 69.0 112.5 ALICE F 13 56.5 84.0 BARBARA F 13 65.3 98.0 CAROL F 14 62.8 102.5 HENRY M 14 63.5 102.5 RUN; PROC PRINT;
DATA CLASS;
INPUT NAME $ SEX $ AGE HEIGHT WEIGHT;
CARDS;
ALFRED M 14 69.0 112.5
ALICE F 13 56.5 84.0
BARBARA F 13 65.3 98.0
CAROL F 14 62.8 102.5
HENRY M 14 63.5 102.5
RUN;
PROC PRINT;
TITLE 'DATA';
RUN;
proc print data=CLASS;run;
PROC FCMP OUTLIB = work.functions.func;
function populationCalc(HEIGHT,WEIGHT,thres);
pop=HEIGHT-WEIGHT-thres;
return (pop);
ENDSUB;
options cmplib=(work.functions);
%macro fine(i);
data ex;
set CLASS;
thres=&i;
pop = populationCalc(HEIGHT,WEIGHT,thres);
if (pop>50) then score=1;
else score=0;
run;
proc iml;
USE ex;
READ all var _ALL_ into ma[colname=varNames];
CLOSE ex;
nn=nrow(ma);
total_score=sum(ma[,'thres']);
avg_score=sum(ma[,'thres'])/nn;
print total_score avg_score;
%mend fine;
%fine(10);
%fine(100);
%fine(150);
我想为函数'fine()'构建一个循环,它也使用宏,但结果并不像我预期的那样。我怎样才能解决这个问题
%macro ct(n);
data data_want;
%do i=1 %to &n;
x=%fine(&i);
output x;
%end;
run;
%macro ct;
%ct(10);
%fine
不会生成任何可在数据步变量赋值语句的右侧(RHS)上下文中使用的文本
调用%ct
i total_score average_score
- ----------- -------------
1 5 1
2 10 2
3 15 3
etc...
第1步。保存IML结果
将其添加到%fine
中IML代码的底部,替换打印
create fine_out var {total_score avg_score};
append;
close fine_out;
quit;
第2步。重写ct宏
在数据步骤上下文之外调用%fine
,以便可以运行数据和IML步骤。将IML输出附加到结果数据集
%macro ct(n,out=result);
%local i;
%do i=1 %to &n;
%fine(&i)
%if &i = 1 %then %do;
data &out; set fine_out; run;
%end;
%else %do;
proc append base=&out data=fine_out; run;
%end;
%end;
%mend;
options mprint;
%ct(10)
这应该是基于您的数据的输出WORK.RESULT
您也可以考虑使用call Exchange而不是宏循环。非常感谢。我想知道在哪里可以找到一些关于SAS函数编程和模拟的书籍和资料。关于这一点,我有很多问题,但我能找到的所有书都是给初学者的。我必须通过谷歌搜索找到解决方案。