Hello,
I would like get macro variable value in quotations in below, I am using as below but its not working.
%getnum(var1=PSA ne ., var2=%str("PSA BY MEDIAN (&median.)"), nn=);
Any solutions?
Thanks,
Nyala
I only needed the part of the log where you ran %GETNUM and it didn't work, not the 3000 lines above that.
WARNING: Apparent symbolic reference MEDIAN not resolved.
You have not assigned a value to &median
What is not working?
I not getting actual macro variable value in quotations, I am getting as "PSA BY MEDIAN (&median.)".
@chinna0369 wrote:
Hello,
I would like get macro variable value in quotations in below, I am using as below but its not working.
%getnum(var1=PSA ne ., var2=%str("PSA BY MEDIAN (&median.)"), nn=);
Any solutions?
How will this macro variable &var2 be used inside of %GETNUM?
Usually, it's not necessary to have macro variable values enclosed in quotes or in double-quotes, that just complicates things. Typically, inside the macro you can just refer to &var2, if you need it in quotes, as
"&var2"
which is much simpler than trying to get quotes around it above as you are trying to do.
@chinna0369 wrote:
Okay, if I create macro variable inside quotes as "&var2" How can I give special characters such as %, (, ). etc. So I have created &var2 like above.
Please show us how this macro variable &var2 will be used inside the macro.
Below is the macro I have written for counts, and callings
** Get counts and create macro to repeat for every variable;
%macro getnum(out=, var1=, var2=, nn=);
%if 0=%length(&nn) %then %do;
%global seq ;
%let seq=%eval(&seq+1);
%let nn=&seq;
%end;
%if 0=%length(&out) %then %let out=out&nn ;
proc sql;
create table stp1 as
select distinct trtpn, count(distinct usubjid) as n,
case when trtpn=1 then strip(put(calculated n, 3.))||" ("||strip(put((calculated n/&n1.)*100, 5.1))||")"
when trtpn=2 then strip(put(calculated n, 3.))||" ("||strip(put((calculated n/&n2.)*100, 5.1))||")"
when trtpn=9 then strip(put(calculated n, 3.))||" ("||strip(put((calculated n/&n3.)*100, 5.1))||")"
else ""
end as numm
from adsl1
where &var1.
group by trtpn;
quit;
proc transpose data=stp1 out=stp2;
var numm;
id trtpn;
run;
data &out.;
length v1 v2 v3 v4 $200.;
set stp2;
v1=&var2.;
v2=_1;
v3=_2;
v4=_9;
ord=&nn.;
keep ord v1-v4;
run;
%mend;
%getstats(var1=tidist, var2=%str(TIME FROM INITIAL DIAGNOSIS TO INITIATION OF STUDY THERAPY (YEARS)), nn=, mm=);
%getnum(var1=TIDISTC ne '', var2=%unquote("TIME FROM INITIAL DIAGNOSIS TO INITIATION OF STUDY THERAPY (%)"), nn=);
%getnum(var1=PSA ne ., var2=%str("PSA BY MEDIAN (&median.)"), nn=);
Your macro is using VAR2 in only one place:
v1=&var2.;
Since you appear to want V1 to be a character variable just include the quotes when calling the macro.
So your examples calls can be:
%getnum(var1=TIDISTC ne ' ', var2='TIME FROM INITIAL DIAGNOSIS TO INITIATION OF STUDY THERAPY (%)', nn=);
%getnum(var1=PSA ne ., var2="PSA BY MEDIAN (&median.)", nn=);
Using single quotes for the first example will prevent the macro processor from looking at the % in the value (although I don't think it is actually going to cause any trouble).
If you are worried about special characters inside of the value of MEDIAN then use %SUPERQ() to add macro quoting.
%getnum(var1=PSA ne ., var2="PSA BY MEDIAN (%superq(median))", nn=);
@chinna0369 wrote:
Okay, if I create macro variable inside quotes as "&var2" How can I give special characters such as %, (, ). etc. So I have created &var2 like above.
It is really not at all clear what your question is.
Here is example of referencing a macro variables value inside of double quotes.
%let vara=Text of vara;
%let varb=&vara;
%let varc="&vara";
Why did you include the %STR() in your original question? Are you worried that the value of VARA has commas or other characters that have special meaning in the macro call?
Yes, because of special characters I am using %str, %unquote. I have given my whole code in one of my replies.
Since I don't have your input data sets or the other macro, here is an abbreviated piece of code that handles &var2 properly
%macro getnum(out=, var1=, var2=, nn=);
data _a_;
length v1 v2 v3 v4 $200.;
set sashelp.class;
v1="&var2";
keep v1-v4;
run;
%mend;
%getnum(var2=TIME FROM INITIAL DIAGNOSIS TO INITIATION OF STUDY THERAPY %nrstr(%%));
I have another question. &var2 equals TIME FROM INITIAL DIAGNOSIS TO INITIATION OF STUDY THERAPY %. Why is this a variable in a data set, since it never varies? Shouldn't it be a label or a title?
Okay, got it. Thank you so much. But I have one more question. Can I use &median. like below? But it looks like it is not working properly? I mean &median. value is not taking in below var1 macro variable.
** Median calculation for counts category untill a variable created in ADSL;
proc sql noprint;
select v4 into :median from out59 where v1 eq '~{nbspace 5}MEDIAN';
quit;
%put &median.;
** PSA BY MEDIAN (XXXX);
%getnum(var1=PSA ne ., var2=%str("PSA BY MEDIAN (&median.)"), nn=);
%getnum(var1=PSA < &median., var2=%str("~{nbspace 5}< MEDIAN"), nn=);
%getnum(var1=PSA >= &median., var2=%str("~{nbspace 5}>= MEDIAN"), nn=);
Sorry for the confusion.
@chinna0369 wrote:
Okay, got it. Thank you so much. But I have one more question. Can I use &median. like below? But it looks like it is not working properly? I mean &median. value is not taking in below var1 macro variable.
** Median calculation for counts category untill a variable created in ADSL; proc sql noprint; select v4 into :median from out59 where v1 eq '~{nbspace 5}MEDIAN'; quit; %put &median.; ** PSA BY MEDIAN (XXXX); %getnum(var1=PSA ne ., var2=%str("PSA BY MEDIAN (&median.)"), nn=); %getnum(var1=PSA < &median., var2=%str("~{nbspace 5}< MEDIAN"), nn=); %getnum(var1=PSA >= &median., var2=%str("~{nbspace 5}>= MEDIAN"), nn=);
Sorry for the confusion.
What is not working? Please show us the log from when you run %GETNUM by including this command
options mprint;
above the line that begins with %getnum, then running that line and %getnum together. Show us the full unedited unchopped complete log as it appears for %GETNUM, in the sequendce that it appears in the LOG. Copy the log as text, and then paste it into the window that appears when you click on the </> icon. DO NOT SKIP THIS STEP.
Here is the log:
217 *************** 218 **** Stats **** 219 **************; 220 ** Get descriptive stats and create macro to repeat for every variable; 221 %macro getstats(out=, var1=, var2=, nn=, mm=); 222 %if 0=%length(&nn) %then %do; 223 %global seq ; 224 %let seq=%eval(&seq+1); 225 %let nn=&seq; 226 %let mm=&seq-0.5; 227 %end; 228 %if 0=%length(&out) %then %let out=out&nn ; 229 230 proc means data=adsl; 231 var &var1.; 232 class trtpn; 233 output out=step1 n=count mean=mn std=std median=mdn q1=qtr1 q3=qtr3 min=mini max=maxi; 234 run; 235 236 data step2; 237 set step1(where=(trtpn ne .)); 238 if count ne . then cnt=strip(put(count,8.)); 239 else cnt=''; 240 if mn ne . then mnsd=strip(put(mn,8.));*||" ("||strip(put(std,8.1))||")"; 241 else mnsd=''; 242 if mdn ne . then mdian=strip(put(mdn,8.)); 243 else mdian=''; 244 if qtr3 ne . then qtrs=strip(put(qtr1,8.))||", "||strip(put(qtr3,8.)); 245 else qtrs=''; 246 if mini ne . and maxi ne . then minmax=strip(put(mini,8.))||", "||strip(put(maxi,8.)); 247 else minmax=''; 248 if std ne . then stdev=strip(put(std,8.)); 249 else stdev=''; 250 keep trtpn cnt mnsd mdian qtrs minmax stdev; 251 run; 252 253 proc transpose data=step2 out=step3; 254 var cnt mnsd mdian qtrs minmax stdev; 255 id trtpn; 256 run; 257 258 data step4; 259 length v1 v2 v3 v4 $200.; 260 set step3; 261 262 if _NAME_ eq "cnt" then v1="~{nbspace 5}N"; 263 else if _NAME_ eq "mnsd" then v1="~{nbspace 5}MEAN"; 264 else if _NAME_ eq "mdian" then v1="~{nbspace 5}MEDIAN"; 265 else if _NAME_ eq "qtrs" then v1="~{nbspace 5}Q1, Q3"; 266 else if _NAME_ eq "minmax" then v1="~{nbspace 5}MIN, MAX"; 267 else if _NAME_ eq "stdev" then v1="~{nbspace 5}STANDARD DEVIATION"; 268 269 v2=_1; 270 v3=_2; 271 v4=_9; 272 273 ord=&nn.; 274 275 keep ord v1 v2 v3 v4; 276 run; 277 278 data dummy; 279 v1="&var2"; 280 ord=&mm.; 281 run; 282 283 data &out.; 284 set step4 dummy; 285 by ord; 286 run; 287 %mend getstats; 288 289 ************ 290 ** counts ** 291 ***********; 292 ** Get counts and create macro to repeat for every variable; 293 %macro getnum(out=, var1=, var2=, nn=); 294 %if 0=%length(&nn) %then %do; 295 %global seq ; 296 %let seq=%eval(&seq+1); 297 %let nn=&seq; 298 %end; 299 %if 0=%length(&out) %then %let out=out&nn ; 300 301 proc sql; 302 create table stp1 as 303 select distinct trtpn, count(distinct usubjid) as n, 304 case when trtpn=1 then strip(put(calculated n, 3.))||" ("||strip(put((calculated 304 ! n/&n1.)*100, 5.1))||")" 305 when trtpn=2 then strip(put(calculated n, 3.))||" ("||strip(put((calculated 305 ! n/&n2.)*100, 5.1))||")" 306 when trtpn=9 then strip(put(calculated n, 3.))||" ("||strip(put((calculated 306 ! n/&n3.)*100, 5.1))||")" 307 else "" 308 end as numm 309 from adsl1 310 where &var1. 311 group by trtpn; 312 quit; 313 314 proc transpose data=stp1 out=stp2; 315 var numm; 316 id trtpn; 317 run; 318 319 data &out.; 320 length v1 v2 v3 v4 $200.; 321 set stp2; 322 323 v1=&var2.; 324 v2=_1; 325 v3=_2; 326 v4=_9; 327 328 ord=&nn.; 329 330 keep ord v1-v4; 331 run; 332 %mend; 333 334 %let seq=0; 421 ** Median calculation for counts category untill a variable created in ADSL; 422 proc sql noprint; 423 select v4 into :median from out59 where v1 eq '~{nbspace 5}MEDIAN'; NOTE: No rows were selected. 424 quit; NOTE: PROCEDURE SQL used (Total process time): real time 0.01 seconds user cpu time 0.00 seconds system cpu time 0.01 seconds memory 5684.12k OS Memory 29948.00k Timestamp 01/04/2021 02:36:14 PM Step Count 205 Switch Count 0 WARNING: Apparent symbolic reference MEDIAN not resolved. 425 %put &median.; &median. 426 ** PSA BY MEDIAN (XXXX); 427 %getnum(var1=PSA ne ., var2=%str("PSA BY MEDIAN (&median.)"), nn=); WARNING: Apparent symbolic reference MEDIAN not resolved. NOTE: Table WORK.STP1 created, with 3 rows and 3 columns. NOTE: PROCEDURE SQL used (Total process time): real time 0.02 seconds user cpu time 0.00 seconds system cpu time 0.00 seconds memory 5809.00k OS Memory 29948.00k Timestamp 01/04/2021 02:36:14 PM Step Count 206 Switch Count 0 NOTE: There were 3 observations read from the data set WORK.STP1. NOTE: The data set WORK.STP2 has 1 observations and 4 variables. NOTE: PROCEDURE TRANSPOSE used (Total process time): real time 0.02 seconds user cpu time 0.00 seconds system cpu time 0.01 seconds memory 2836.21k OS Memory 26876.00k Timestamp 01/04/2021 02:36:14 PM Step Count 207 Switch Count 0 WARNING: Apparent symbolic reference MEDIAN not resolved. NOTE: There were 1 observations read from the data set WORK.STP2. NOTE: The data set WORK.OUT61 has 1 observations and 5 variables. NOTE: DATA statement used (Total process time): real time 0.01 seconds user cpu time 0.00 seconds system cpu time 0.01 seconds memory 1305.84k OS Memory 25340.00k Timestamp 01/04/2021 02:36:14 PM Step Count 208 Switch Count 0 428 options mprint; 429 %getnum(var1=PSA < &median., var2=%str("~{nbspace 5}< MEDIAN"), nn=); WARNING: Apparent symbolic reference MEDIAN not resolved. MPRINT(GETNUM): proc sql; WARNING: Apparent symbolic reference MEDIAN not resolved. NOTE 138-205: Line generated by the macro variable "VAR1". 1 PSA < &median. - 22 ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, a missing value, BTRIM, INPUT, PUT, SUBSTRING, USER. WARNING: Apparent symbolic reference MEDIAN not resolved. NOTE 137-205: Line generated by the invoked macro "GETNUM". 2 3.))||" ("||strip(put((calculated n/&n2.)*100, 5.1))||")" when trtpn=9 then 2 ! strip(put(calculated n, 3.))||" ("||strip(put((calculated n/&n3.)*100, 5.1))||")" 2 ! else "" end as numm from adsl1 where &var1. group by trtpn; -- 22 ERROR 22-322: Syntax error, expecting one of the following: GROUP, ORDER. NOTE: Line generated by the invoked macro "GETNUM". 2 3.))||" ("||strip(put((calculated n/&n2.)*100, 5.1))||")" when trtpn=9 then 2 ! strip(put(calculated n, 3.))||" ("||strip(put((calculated n/&n3.)*100, 5.1))||")" 2 ! else "" end as numm from adsl1 where &var1. group by trtpn; -- 76 ERROR 76-322: Syntax error, statement will be ignored. MPRINT(GETNUM): create table stp1 as select distinct trtpn, count(distinct usubjid) as n, case when trtpn=1 then strip(put(calculated n, 3.))||" ("||strip(put((calculated n/ 3)*100, 5.1))||")" when trtpn=2 then strip(put(calculated n, 3.))||" ("||strip(put((calculated n/ 4)*100, 5.1))||")" when trtpn=9 then strip(put(calculated n, 3.))||" ("||strip(put((calculated n/ 7)*100, 5.1))||")" else "" end as numm from adsl1 where PSA < & group by trtpn; MPRINT(GETNUM): quit; NOTE: The SAS System stopped processing this step because of errors. NOTE: PROCEDURE SQL used (Total process time): real time 0.08 seconds user cpu time 0.01 seconds system cpu time 0.04 seconds memory 74.84k OS Memory 24308.00k Timestamp 01/04/2021 02:36:14 PM Step Count 209 Switch Count 0 MPRINT(GETNUM): proc transpose data=stp1 out=stp2; MPRINT(GETNUM): var numm; MPRINT(GETNUM): id trtpn; MPRINT(GETNUM): run; NOTE: There were 3 observations read from the data set WORK.STP1. NOTE: The data set WORK.STP2 has 1 observations and 4 variables. NOTE: PROCEDURE TRANSPOSE used (Total process time): real time 0.02 seconds user cpu time 0.00 seconds system cpu time 0.01 seconds memory 2836.21k OS Memory 26876.00k Timestamp 01/04/2021 02:36:14 PM Step Count 210 Switch Count 0 MPRINT(GETNUM): data out62; MPRINT(GETNUM): length v1 v2 v3 v4 $200.; MPRINT(GETNUM): set stp2; MPRINT(GETNUM): v1="~{nbspace 5}< MEDIAN"; MPRINT(GETNUM): v2=_1; MPRINT(GETNUM): v3=_2; MPRINT(GETNUM): v4=_9; MPRINT(GETNUM): ord=62; MPRINT(GETNUM): keep ord v1-v4; MPRINT(GETNUM): run; NOTE: There were 1 observations read from the data set WORK.STP2. NOTE: The data set WORK.OUT62 has 1 observations and 5 variables. NOTE: DATA statement used (Total process time): real time 0.04 seconds user cpu time 0.01 seconds system cpu time 0.01 seconds memory 1305.71k OS Memory 25340.00k Timestamp 01/04/2021 02:36:14 PM Step Count 211 Switch Count 0
I only needed the part of the log where you ran %GETNUM and it didn't work, not the 3000 lines above that.
WARNING: Apparent symbolic reference MEDIAN not resolved.
You have not assigned a value to &median
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.