Top Banner
PhUSE EU Connect 2018, Frankfurt Make Your Macro Great from the Very Beginning Yuliia Bahatska Vladlen Ivanushkin Syneos Health DataFocus
29

Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

Sep 26, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

PhUSE EU Connect 2018, Frankfurt

Make Your Macro Great from the

Very Beginning

Yuliia Bahatska Vladlen Ivanushkin

Syneos Health DataFocus

Page 2: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

2

INTRODUCTION

This is me when I think of my first macro

Page 3: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

3

THE COUNTW FUNCTION

%subgroup_analysis(data=data1, subgroup=subgroup1);

%subgroup_analysis(data=data1, subgroup=subgroup2);

%subgroup_analysis(data=data1, subgroup=subgroup3);

…who knows how many more macro calls

%subgroup_analysis(data=data1, subgroups=subgroup1 subgroup2 subgroup3 …);

Page 4: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

4

THE COUNTW FUNCTION

%subgroup_analysis(data=data1, subgroup=subgroup1);

%subgroup_analysis(data=data1, subgroup=subgroup2);

%subgroup_analysis(data=data1, subgroup=subgroup3);

…who knows how many more macro calls

%subgroup_analysis(data=data1, subgroups=subgroup1 subgroup2 subgroup3 …);

%macro subgroup_analysis(data=, subgroups=); %local subgroup i;%do i=1 %to %sysfunc(countw(&subgroups));

%let subgroup=%scan(&subgroups, &i);

<Code that needs to be repeated for each value of subgroup.>

%end;%mend subgroup_analysis;

Page 5: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

5

THE COUNTW FUNCTION

%subgroup_analysis(data=data1, subgroup=subgroup1);

%subgroup_analysis(data=data1, subgroup=subgroup2);

%subgroup_analysis(data=data1, subgroup=subgroup3);

…who knows how many more macro calls

%subgroup_analysis(data=data1, subgroups=subgroup1 subgroup2 subgroup3 …);

%macro subgroup_analysis(data=, subgroups=); %local subgroup i;%do i=1 %to %sysfunc(countw(&subgroups)); counts words in &subgroups

%let subgroup=%scan(&subgroups, &i); gets the &ith word from &subgroups

<Code that needs to be repeated for each value of subgroup.>

%end;%mend subgroup_analysis;

Page 6: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

6

THE GETOPTION FUNCTION

Who changedmy sessionsettings?!

Page 7: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

7

THE GETOPTION FUNCTION

%local l_pagesize;

%let l_pagesize= %sysfunc(getoption(PAGESIZE)); save option

Do whatever you need with it, e.g.:

options pagesize=60;

Change it back:

options pagesize=&l_pagesize;

Page 8: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

8

THE GETOPTION FUNCTION

%local l_pagesize;

%let l_pagesize= %sysfunc(getoption(PAGESIZE)); save option

Do whatever you need with it, e.g.:

options pagesize=60;

Change it back:

options pagesize=&l_pagesize;

proc datasets memtype=data nolist nowarn;

delete _temp: <names of all macro-created temporary datasets>;

quit;

%end;

%if &delete_temp_datasets=1 %then %do;

Page 9: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

9

THE REGULAR EXPRESSIONSCHANGING DELIMITERS IN A STRING

byvar=var1 var2 var3_2 var23

proc something...; proc sql;

by &byvar; &byvar ...by &byvar;

run; quit;

%let supp_byvar=%sysfunc(prxchange(s/\s+/%str(,)/, -1, &byvar));

supp_byvar=var1,var2,var3_2,var23

proc sql;

&supp_byvar ...by &supp_byvar;

quit;

Page 10: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

10

THE REGULAR EXPRESSIONSSEARCHING WORDS IN A STRING

%let words=WORD1 WORD2 ... WORDN;

%do counter=1 %to %sysfunc(countw(&words));%let word=%scan(&words, &counter);%if %sysfunc(findw(&string, &word)) %then %let wrd_ex_loop=YES;

%end;

%if %sysfunc(prxmatch(/\b(WORD1|WORD2|...|WORDN)\b/, &string))

%if %sysfunc(findw(&string, WORD1)) or %sysfunc(findw(&string, WORD2)) or … or %sysfunc(findw(&string, WORDN)) …

OR

Page 11: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

11

THE REGULAR EXPRESSIONSSEARCHING WORDS IN A STRING

%let words=WORD1 WORD2 ... WORDN;

%do counter=1 %to %sysfunc(countw(&words));%let word=%scan(&words, &counter);%if %sysfunc(findw(&string, &word)) %then %let wrd_ex_loop=YES;

%end;

%if %sysfunc(prxmatch(/\b(WORD1|WORD2|...|WORDN)\b/, &string))

%if %sysfunc(findw(&string, WORD1)) or %sysfunc(findw(&string, WORD2)) or … or %sysfunc(findw(&string, WORDN)) …

OR

✓ more convenient

✓ more flexible

✓ less code

✓ easier to understand

Page 12: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

12

THE REGULAR EXPRESSIONSSUBTRACTION OF TWO STRINGS

%let text=WORD1 WORD2 WORD3 WORD4 WORD5;%let words_to_ignore=WORD4 WORD1;

Page 13: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

13

THE REGULAR EXPRESSIONSSUBTRACTION OF TWO STRINGS

%let text=WORD1 WORD2 WORD3 WORD4 WORD5;%let words_to_ignore=WORD4 WORD1;

/*Insert | symbols to use in regular expression*/%let words_to_ignore_del=%sysfunc(prxchange(s/\s+/|/, -1, &words_to_ignore));

Page 14: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

14

THE REGULAR EXPRESSIONSSUBTRACTION OF TWO STRINGS

%let text=WORD1 WORD2 WORD3 WORD4 WORD5;%let words_to_ignore=WORD4 WORD1;

/*Insert | symbols to use in regular expression*/%let words_to_ignore_del=%sysfunc(prxchange(s/\s+/|/, -1, &words_to_ignore));%put NOTE: Result - %cmpres(%sysfunc(prxchange(s/\b(&words_to_ignore_del)\b//, -1, &text)));

Exclude all words given in &words_to_ignore from &text

Page 15: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

15

THE REGULAR EXPRESSIONSSUBTRACTION OF TWO STRINGS

%let text=WORD1 WORD2 WORD3 WORD4 WORD5;%let words_to_ignore=WORD4 WORD1;

/*Insert | symbols to use in regular expression*/%let words_to_ignore_del=%sysfunc(prxchange(s/\s+/|/, -1, &words_to_ignore));%put NOTE: Result - %cmpres(%sysfunc(prxchange(s/\b(&words_to_ignore_del)\b//, -1, &text)));

Exclude all words given in &words_to_ignore from &text

Page 16: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

16

COMPLEX MACRO PARAMETERS

Sort several datasets in the same way with some exception, for instance:

▪ Datasets DATA1-DATA5 need to be sorted datasets = DATA1 DATA2 DATA3 DATA4 DATA5

▪ DATA1, DATA2, DATA4 by VAR1 VAR2 sort_vars = VAR1 VAR2

▪ DATA3 by VAR1 VAR3

▪ DATA5 by VAR2 VAR4

%sort_variables(datasets = DATA1 DATA2 DATA3 DATA4 DATA5,sort_vars = VAR1 VAR2,exception = DATA3: VAR1 VAR3#DATA5: VAR2 VAR4)

exception = DATA3: VAR1 VAR3#DATA5: VAR2 VAR4

Page 17: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

17

COMPLEX MACRO PARAMETERS

%macro sort_variables(datasets=, sort_vars=, exception=);<For each single word in &datasets:>%if %index(&exception, &dataset.:) %then %do;

<If “word:” is contained in &exception then get respective sorting variables from &exception>

%let _sort_except=%sysfunc(prxchange(s/.*&dataset.://, 1, &exception));

%let sort_except=%scan(&_sort_except, 1, #);

%end;%else %let sort_except=;

Page 18: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

18

COMPLEX MACRO PARAMETERS

%macro sort_variables(datasets=, sort_vars=, exception=);<For each single word in &datasets:>%if %index(&exception, &dataset.:) %then %do;

<If “word:” is contained in &exception then get respective sorting variables from &exception>

%let _sort_except=%sysfunc(prxchange(s/.*&dataset.://, 1, &exception));DATA3: VAR1 VAR3#DATA5: VAR2 VAR4 VAR1 VAR3#DATA5: VAR2 VAR4

%let sort_except=%scan(&_sort_except, 1, #);VAR1 VAR3#DATA5: VAR2 VAR4 VAR1 VAR3

%end;%else %let sort_except=;

Page 19: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

19

COMPLEX MACRO PARAMETERS

%macro sort_variables(datasets=, sort_vars=, exception=);<For each single word in &datasets:>%if %index(&exception, &dataset.:) %then %do;

<If “word:” is contained in &exception then get respective sorting variables from &exception>

%let _sort_except=%sysfunc(prxchange(s/.*&dataset.://, 1, &exception));DATA3: VAR1 VAR3#DATA5: VAR2 VAR4 VAR1 VAR3#DATA5: VAR2 VAR4

%let sort_except=%scan(&_sort_except, 1, #);VAR1 VAR3#DATA5: VAR2 VAR4 VAR1 VAR3

%end;%else %let sort_except=;

proc sort data=&dataset out=&dataset._srt;by %sysfunc(coalescec(&sort_except, &sort_vars));

run;%mend sort_variables;

Page 20: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

20

MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION

%macro print_note(data=, footnote=text from the dataset - %nrstr(&studyid));proc sql;

select studyid into: studyid from &data;quit;

/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);

%mend print_note;

Page 21: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

21

MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION

%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;

select studyid into: studyid from &data;quit;

/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);

%mend print_note;

Not resolved yet

Page 22: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

22

MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION

%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;

select studyid into: studyid from &data;quit;

/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);

%mend print_note;

Not resolved yet

Is resolved here

Page 23: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

23

MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION

%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;

select studyid into: studyid from &data;quit;

/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);

%mend print_note;

data data1;studyid='12345';

run;

%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));

Not resolved yet

Is resolved here

Page 24: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

24

MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION

%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;

select studyid into: studyid from &data;quit;

/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);

%mend print_note;

data data1;studyid='12345';

run;

%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));

NOTE: text from the dataset – 12345

Not resolved yet

Is resolved here

Page 25: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

25

MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION

%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;

select studyid into: studyid from &data;quit;

/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);

%mend print_note;

data data1;studyid='12345';

run;

%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));

NOTE: text from the dataset – 12345

NOTE: text from the dataset - &studyid

Not resolved yet

Is resolved here

Page 26: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

26

MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION

%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;

select studyid into: studyid from &data;quit;

/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);

%mend print_note;

data data1;studyid='12345';

run;

%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));

NOTE: text from the dataset – 12345

NOTE: text from the dataset - &studyid

%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));WARNING: Apparent symbolic reference STUDYID not resolved.

Not resolved yet

Is resolved here

Page 27: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

27

MACRO PARAMETER CHECKS

In the beginning of the macro set some variable, i.e. param_error to 0:

Perform the checks, i.e.

Check whether a dataset/directory/library/format exists

Check whether a variable specified in a parameter is of required type. Like NUMBER, YESNO, CHAR

etc.

Check if a variable exists in a dataset (if the source dataset is known) etc.

If a check fails then

Provide informative message to the log for all failed checks

set param_error to 1 and

After all checks have run, see if any check failed and if yes, abort macro

execution

%if &param_error=1 %then %do;

%put ERROR: The macro terminated due to errors in the macro parameters;

%goto exit;

%end;

Page 28: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

28

MACRO PARAMETER CHECKSSTANDARDIZATION OF MACRO PARAMETER VALUES

Omiting not intended letter case issues %UPCASE

Omiting redundant blanks %CMPRES

Harmonizing values YES Y, NO N

etc.

Page 29: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to

29

CONCLUSION

Great Macro

COUNTW, QUOTING

THE GETOPTION FUNCTION

RESTORING SESSION

REGULAR EXPRESSIONS

PARAMETER CHECKS