如何在SAS中为宏构建循环?

如何在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;

我想在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;
    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函数编程和模拟的书籍和资料。关于这一点,我有很多问题,但我能找到的所有书都是给初学者的。我必须通过谷歌搜索找到解决方案。