Hello,
I am not looking for all kinds of ways how to dedup macro values when combining them into one. I have code that does that. Wonder if there is a built SAS sys functon of some sort that does that in one. For example
%let new100 = %sysdedup(&old1 &old2 .... &old100 &old102);
%sysdedup is just my creation that needs to be replaced with a legit one if any.
Thanks.
Jia Xin
I see in @ArtC's book "Carpenter's Complete Guide to the SAS Macro Language, Third Edition" that he includes a macro to remove duplicate values (Program 12.4.7, "DistinctList"). I suspect that if Mr. Carpenter isn't aware of an official SAS macro to remove duplicates that there isn't one. However, if you do find one, please post the name here; it would be a useful macro.
Good luck,
Jim
I see in @ArtC's book "Carpenter's Complete Guide to the SAS Macro Language, Third Edition" that he includes a macro to remove duplicate values (Program 12.4.7, "DistinctList"). I suspect that if Mr. Carpenter isn't aware of an official SAS macro to remove duplicates that there isn't one. However, if you do find one, please post the name here; it would be a useful macro.
Good luck,
Jim
Jim
Found the mentioned code 12.4.7. Sign on SAS support site. Look for the Macro book. Download 67815_example.zip. The program is 12.4.7, but as of 9-18-2020, the online example copy puts it under Chapter 12 12.4.6.sas. The macro is %macro DistinctList(list).... Not to sound critical, it is kind of long.
Thanks,
Jia Xin
It is not clear what you mean, but I don't think there is anything like that.
Sounds like you want way to generate a macro variable that has the distinct set of words that are in the existing value.
%macro dedup(words);
%local return i word ;
%do i=1 %to %sysfunc(countw(&words,%str( )));
%let word=%scan(&words,&i,%str( ));
%if not %sysfunc(indexw(&return,&word,%str( ))) %then
%let return=&return &word
;
%end;
&return
%mend dedup;
%put %dedup(a b c a a b d);
If instead you want to give it a list of the names of macro variables and find the set of distinct values of those macro variables you could re-write it this way.
%macro dedupvars(vars);
%local return i var ;
%do i=1 %to %sysfunc(countw(&vars,%str( )));
%let var=%scan(&vars,&i,%str( ));
%if not %sysfunc(indexw(&return,&&&var,%str( ))) %then
%let return=&return &&&var
;
%end;
&return
%mend dedupvars;
%let a=a;
%let b=b;
%let c=a;
%put %dedupvars(a b c);
I have 6 macros that do this. I was just looking for a built in SAS function to simplify. Thank you. Jia
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.