epib 698e lecture 12 introduction to sas macro

38
EPIB 698E Lecture 12 Introduction to SAS Macro Raul Cruz-Cano Fall 2013

Upload: len

Post on 09-Jan-2016

61 views

Category:

Documents


3 download

DESCRIPTION

EPIB 698E Lecture 12 Introduction to SAS Macro. Raul Cruz-Cano Fall 2013. Announcements. Last homework due on Tuesday Not included in the Final Exam Solutions to be posted after the deadline Final Exam next Wednesday. What is SAS Macro?. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: EPIB 698E Lecture 12 Introduction to SAS Macro

EPIB 698E Lecture 12Introduction to SAS Macro

Raul Cruz-CanoFall 2013

Page 2: EPIB 698E Lecture 12 Introduction to SAS Macro

Announcements

• Last homework due on Tuesday – Not included in the Final Exam– Solutions to be posted after the deadline

• Final Exam next Wednesday

2

Page 3: EPIB 698E Lecture 12 Introduction to SAS Macro

3

What is SAS Macro?

• The SAS Macro language is another language that rests on top of regular SAS code.

• It allows you to assign a name to groups of SAS programming statements. From that point on, you can work with the name rather than with the text itself.

• Macros are particularly useful if you want to make your SAS programs more flexible and allow them to be used in different situations without having to rewrite entire programs

Page 4: EPIB 698E Lecture 12 Introduction to SAS Macro

4

What is SAS Macro?

• When you submit a regular SAS code, SAS compiles and then immediately execute it. But for macros, there is an additional step, that is SAS will pass you macro statement to the macro processor which will generate standard SAS code.

Macro statement Macro processor Standard SAS

statement

Compile and execute

Results

Page 5: EPIB 698E Lecture 12 Introduction to SAS Macro

5

What is SAS Macro?

• Macros consist of collections of

a) regular SAS program statements,

b) macro variables,

c) macro statements and

d) macro functions

contained within a %MACRO and a %MEND.

• Macro statements, often similar to their regular SAS equivalents, but start with the % symbol, such as, %MACRO and %MEND, %DO, %END, %IF, %THEN, %ELSE and %LET.

Page 6: EPIB 698E Lecture 12 Introduction to SAS Macro

6

Part I: Macro Variables

• can be defined and used anywhere in a SAS program, except data lines (i.e. raw data).

• contain one value that remains constant until explicitly changed.

Page 7: EPIB 698E Lecture 12 Introduction to SAS Macro

7

Part I: Defining Macro Variables (%LET statement)%LET statement)

%LET macrovar = value;• macrovar : regular SAS naming conventions

• value : any string or macro expression– stored as character type– length 0-32K characters– math expressions are not evaluated– quotations not needed

• leading/trailing blanks are removed

Page 8: EPIB 698E Lecture 12 Introduction to SAS Macro

8

Part I: %LET statementExamples

Assignment statement

%let name = Ed;

%let name2 = ‘Ed’;

%let title = “Ed’s report”;

%let start = 3+4;

Macro Variable Valuename Edname2 ‘Ed’

Macro Variable Valuetitle “Ed’s report”start 3+4

Page 9: EPIB 698E Lecture 12 Introduction to SAS Macro

9

Part I: Using Macro Variables

To use a macro variable, precede the macro variable name with an ampersand (&).

Example: &macrovar

Page 10: EPIB 698E Lecture 12 Introduction to SAS Macro

10

Part I: Using Macro Variables--Example1

%let var_list = RBC WBC cholesterol;

title "Using a Macro Variable List";

proc means data=blood n mean min max ;

var &var_list;

run;

Page 11: EPIB 698E Lecture 12 Introduction to SAS Macro

11

Part I: Using Macro Variables—Example2

%let n = 3;

data generate;

do Subj = 1 to &n;

x = int(100*ranuni(0) + 1);

output;

end;

run;

Page 12: EPIB 698E Lecture 12 Introduction to SAS Macro

12

Part I: Combining Macro Variables with Text

• Macro variables can be appended to text or variable names:

varname&macrovar

• Or prepended:&macrovar.text

you need to insert a . between the macro variable and the text so SAS knows where the text begins.

• Or connected to other macro variables:&macvar1&macvar2

Page 13: EPIB 698E Lecture 12 Introduction to SAS Macro

13

Part I: Combining Macro Variables with Text (Examples)

%let graphics = g;

%let file=blood;

proc &graphics.plot data=&file;

plot RBC*WBC;

run;

proc gplot data=blood; plot RBC * WBC;run;

Page 14: EPIB 698E Lecture 12 Introduction to SAS Macro

14

Part I: Combining Macro Variables with Text (Examples)

When concatenating a dataset to a macro variable containing the libname, you need to use double decimal points instead of one.

%let lib = d;

data data1;set &lib..clinic;

run;

data data1;set d.clinic;

run;

Page 15: EPIB 698E Lecture 12 Introduction to SAS Macro

15

Part I: Macro QuotingExamples

• macro variables can not resolve single quotes--you must use double quotes. – %let sitename = Maryland;

title1 “site: &sitename”; title2 ‘site: &sitename’;

title1 “site: Maryland”; title2 ‘site: &sitename’;

Page 16: EPIB 698E Lecture 12 Introduction to SAS Macro

16

Part I: Using SAS automatic Macro Variables—Example5

title "The Date is &sysdate9 - the Time is &systime";

proc print data=blood (obs=5) ;run;

title 'The Date is &sysdate9 - the Time is &systime';proc print data=blood (obs=5) ;run;

Page 17: EPIB 698E Lecture 12 Introduction to SAS Macro

17

Part II: Macros

“A macro is stored text identified by a name.”

Uses:– generating repetitive pieces of SAS code– conditionally executing code

Page 18: EPIB 698E Lecture 12 Introduction to SAS Macro

18

Part II: Defining a MacroBegin with a %MACRO statement and end with a %MEND statement. Coding beginning with % signs is evaluated by the macro processor

Execute the macro with a macro call statement.

%MACRO macro-name;

macro text;

%MEND macro-name;

%macro-name

Define a macro

Execute a macro

Page 19: EPIB 698E Lecture 12 Introduction to SAS Macro

19

Part II: Defining a Macro• %MACRO macro-name;

– begins the macro definition and assigns a name to the macro

• macro text– any text– regular SAS statements or steps– macro variables, functions or statements– combination of the above

• %MEND macro-name;– ends the macro definition– macro-name is optional

Page 20: EPIB 698E Lecture 12 Introduction to SAS Macro

20

Part II: Calling a Macro

• %macro-name– not a SAS statement, therefore doesn’t require a

semi-colon– can be placed anywhere in a program except in

data lines– Submitting a macro definition complies the

macro.– If the macro compiles successfully, SAS will

run the generated SAS code.

Page 21: EPIB 698E Lecture 12 Introduction to SAS Macro

21

Part II: Example 6 -- Defining a Macro

%let a=blood;%let x=sex;

%MACRO sortx;proc sort data=&a;by &x;run;

proc means data=&a;by &x;run;

%MEND sortx;

%sortx;

Page 22: EPIB 698E Lecture 12 Introduction to SAS Macro

22

Part III: Macros with Parameters

We can use %let statement to define a macro variable. Another way to define macro variable is to use parameters.

Parameters pass variable values to macros in the form of macro variables. There are 2 types of parameters:

positional

keyword

Page 23: EPIB 698E Lecture 12 Introduction to SAS Macro

23

Part III: Positional Parameters

%MACRO macro-name (p1, …, pn);

text

%MEND macro-name;

%macro-name(v1, …, vn)

Parameters p1 up to pn.

Values for parameters p1 up to pn.

Page 24: EPIB 698E Lecture 12 Introduction to SAS Macro

24

Part III: Positional Parameters

The parameter list is defined in the %MACRO statement. This list contains names of macro variables referenced only within the macro.

To call this macro and provide values for the macro parameters you list the values you want to substitute for each parameter in the macro call statement. Values are substituted for the parameter variables using a one-to-one correspondence.

Page 25: EPIB 698E Lecture 12 Introduction to SAS Macro

25

Part III: Positional Parameters

Macro parameters: %MACRO macro-name(p1, …, pn);– enclosed in parentheses– separated with commas– Following SAS naming conventions– referenced as a macro variable within the macro

(&p1, &p2, etc )

Page 26: EPIB 698E Lecture 12 Introduction to SAS Macro

26

Part III: Positional ParametersMacro call values: %macro-name(v1, …, vn)

– enclosed in parentheses– separated with commas– are substituted for the parameters using a one-

to-one correspondencev1 ==> p1

– use commas as placeholders to substitute a null value for positional parameters.

Page 27: EPIB 698E Lecture 12 Introduction to SAS Macro

27

Part III: Positional ParametersExample

%MACRO sortvar (file, byvar);proc sort data=&file;

by &byvar;run;

%MEND sortvar;

%sortvar (blood, sex)

proc sort data=blood; by sex;run;

Page 28: EPIB 698E Lecture 12 Introduction to SAS Macro

28

Part III: Keyword Parameters

%MACRO macro-name (KEY1=value, ...,KEYn=value);

text

%MEND macro-name;

%macro-name (KEY1=value, ...,KEYn=value)

Page 29: EPIB 698E Lecture 12 Introduction to SAS Macro

29

Part III: Keyword ParametersThe keyword parameters are defined in the %MACRO

statement. KEYn is the name of the macro variable followed by an =. VALUE is the default value assigned to the macro variable.

To call this macro and substitute different values you must indicate the macro variable (KEYn) followed by an = and the value you want to substitute. You can specify keyword parameters in any order. Parameters not defined are assigned the default value.

Page 30: EPIB 698E Lecture 12 Introduction to SAS Macro

30

Part III: Keyword Parameters

Macro parameters:

%MACRO macro-name(KEY1=value, ..., KEYn=value);– enclosed in parentheses, separated by commas– assigned a default value (null is allowed)– referred to as a macro variable within the macro

(&KEYn)– keyword complies with SAS naming conventions

Page 31: EPIB 698E Lecture 12 Introduction to SAS Macro

31

Part III: Keyword Parameters

Macro call values:

%macro-name (KEY1=value, …, KEYn=value)– enclosed in parentheses, separated by commas– can be null values, text, macro variable references– can be listed in any order– can be omitted from the call (default used)

Page 32: EPIB 698E Lecture 12 Introduction to SAS Macro

32

Part III: Keyword ParametersExample

%MACRO sortvar (file=mylib.clinic, byvar=gender);

proc sort data=&file;

by &byvar;

run;

%MEND sortvar;

%sortvar (file=blood, byvar=sex)

%sortvar

proc sort data=blood; by sex;run;

proc sort data=mylib.clinic;

by gender;run;

Page 33: EPIB 698E Lecture 12 Introduction to SAS Macro

33

Part III: Mixed Parameter List

%MACRO macro-name (p1, …, pn, key=value, …,key=value);

text

%MEND macro-name;

%macro-name(v1, …, vn, key=value, …, key=value)

• all positional parameters must be listed in order before any keyword parameters

Page 34: EPIB 698E Lecture 12 Introduction to SAS Macro

%MACRO sortx4 (LIB, DATANAME, file=&LIB..&dataname, byvar=gender);

proc sort data=&file;

by &byvar;

run;

TITLE "MEANS PROCEDURE OF &DATANAME DATA";

proc means data=&file;

by &byvar;

run;

%MEND sortx4;

%sortx4 (WORK, blood, byvar=gender);

%sortx4 (d, clinic);

34

Page 35: EPIB 698E Lecture 12 Introduction to SAS Macro

35

Part IV writing Macros with conditioning logic • Combining macro and macro variables give you a lot of flexibility, but

you can increase that flexibility by adding macro statements

• Here are the general forms of the macro IF-THEN, DO groups statement:

%IF condition %THEN action;%ELSE %IF condition %THEN action;%ELSE action;

%IF condition %THEN %DO;SAS statements;%END;

Page 36: EPIB 698E Lecture 12 Introduction to SAS Macro

36

%MACRO dailyreports; %IF &SYSDAY =Monday %THEN %DO; PROC PRINT DATA =mylib.blood (obs=5); TITLE 'Monday Report: blood sample data';

run; %END; %ELSE %DO; PROC PRINT DATA =mylib.clinic (obs=5); TITLE 'Tuesday Report: clinic data';

run; %END;%MEND dailyreports;

%dailyreports;

Page 37: EPIB 698E Lecture 12 Introduction to SAS Macro

37

Part V: Using a macro variable to transfer value between data steps

• CALL SYMPUT (‘Macrovar’, value)

• Macrovar: is the name of the macro variable you want to create

• Value: is the value you want to assign to the macro variable

Page 38: EPIB 698E Lecture 12 Introduction to SAS Macro

38

proc means data=blood noprint;

var RBC WBC;

output out=means mean= M_RBC M_WBC;

run;

data _null_;

set means;

call symput('AveRBC',M_RBC);

call symput('AveWBC',M_WBC);

run;

data new;

set blood(obs=5 keep=Subject RBC WBC);

Per_RBC = RBC / &AveRBC;

Per_WBC = WBC / &AveWBC;

format Per_RBC Per_WBC percent8.;

run;