मैं एसएएस में मैक्रो पर आधारित सिमुलेशन करना चाहता हूं। मैं 'ठीक ()' नामक एक फ़ंक्शन बना सकता हूं, कोड इस प्रकार है

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);

मैं फ़ंक्शन 'ठीक ()' के लिए एक लूप बनाना चाहता हूं और मैक्रो का भी उपयोग करता हूं, लेकिन परिणाम मेरी अपेक्षा के अनुरूप नहीं है। मैं इसे कैसे ठीक करूं?

%macro ct(n);
data data_want;
%do i=1 %to &n;
x=%fine(&i);
output x;
%end;
run;
%macro ct;

%ct(10);
sas
0
Xiaol.Song 26 अक्टूबर 2020, 07:32

1 उत्तर

सबसे बढ़िया उत्तर

%fine ऐसा कोई टेक्स्ट जेनरेट नहीं करता है जिसका इस्तेमाल डेटा स्टेप वेरिएबल असाइनमेंट स्टेटमेंट के राइट हैंड साइड (RHS) के संदर्भ में किया जा सकता है।

आप शायद चाहते हैं कि यह डेटा %ct को लागू करने के परिणामस्वरूप सेट किया गया हो

i total_score average_score
- ----------- -------------
1      5           1
2     10           2
3     15           3
etc...

चरण 1. IML परिणाम सहेजें

इसे print के स्थान पर %fine में IML कोड के निचले भाग में जोड़ें

create fine_out var {total_score avg_score};
append;
close fine_out;
quit;

चरण 2. सीटी मैक्रो को फिर से लिखें

%fine को डेटा चरण संदर्भ के बाहर आमंत्रित करें ताकि डेटा और आईएमएल चरण चल सकें। 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 होना चाहिए

enter image description here

1
Richard 26 अक्टूबर 2020, 08:21