BookmarkSubscribeRSS Feed
mariko5797
Pyrite | Level 9

I want to be able to reference different macro variables to add totals to a header like so: Group 1 (N=&N11.), Group 2 (N=&N12.) as so on...

Is there a way to do this all in a single SQL or DATA STEP?

data have;
 input id $ armn agen @@;
 cards;
A 0 1
B 0 2
C 0 3
D 1 4
E 1 1
F 0 3
G 1 4
H 1 5
;
run;

Attempt with DATA STEP

data _null_;
 if 0 then set have nobs= N;
 call symputx(cats('N', AGEN, ARMN), N, 'L');
run;
ERROR: Symbolic variable name N-- must contain only letters, digits, and underscores.

I know you can do something like below with PROC SQL, but I'd rather have the variable name associated with ARMN and AGEN.

proc sql;
 select count(distinct ID) into :n1-:n8 from have group by ARMN, AGEN;
quit;
5 REPLIES 5
Astounding
PROC Star

In your DATA step, what is the name(s) of the macro variable(s) you want to create?

 

This message is telling you that the values of ARMN and AGEN contain characters that are not legal for naming a macro variable.  It might be as simple as embedded blanks within ARMN and GEN, which the compress function can handle.  CATS won't remove embedded blanks.

mariko5797
Pyrite | Level 9
I would want the variable to be &N[ARMN][AGEN]. For example, the count of
subjects with ARMN=1 and AGEN=3 to be stored as &N13.
Quentin
Super User

Why do you have:

if 0 then set

?

 

That means you re not actually reading in the data from work.have. If you remove that, it works fine:

 

data have;
 input id $ armn agen @@;
 cards;
A 0 1
B 0 2
C 0 3
D 1 4
E 1 1
F 0 3
G 1 4
H 1 5
;
run;

data _null_;
 /*if 0 then */ set have nobs= N;
 call symputx(cats('N', AGEN, ARMN), N, 'L');
run;

%put _user_ ;

 Note that "works" means runs without errors.  But it will give the same value to every macro var. Which is probably not what you want.  If you want to count distinct ID's within groups, you could use by-group processing, something like (untested):

data _null_;
  set have ;
  by armn agen id;
  if first.agen then count=0;
  if first.id then count++1;
  if last.agen then call symputx(cats('N', AGEN, ARMN), count, 'L');
run;

 

BASUG is hosting free webinars Next up: Mark Keintz presenting History Carried Forward, Future Carried Back: Mixing Time Series of Differing Frequencies on May 8. Register now at the Boston Area SAS Users Group event page: https://www.basug.org/events.
andreas_lds
Jade | Level 19

Storing data in macro variable often leads to unnecessary complexity in the following steps. You may want to explain the next steps, so that we could suggest a better approach.

mariko5797
Pyrite | Level 9

I want to use them in PROC REPORT, so I can have counts in the headers.

data WANT;
 input VAR ARM1AGE1 ARM1AGE2 ARM2AGE1 ARM2AGE2 @@;
 cards;
Var1 7 4
Var2 3 9
Var3 8 12
;
run;

proc report data= WANT splitchar= '*';
 columns VAR ("Group 1" ARM1AGE1 ARM1AGE2) ("Group 2" ARM2AGE1 ARM2AGE2);
 define VAR / display "Variable";
 define ARM1AGE1 / display "<18yo*(N=&N11.)";
 define ARM1AGE2/ display ">=18yo*(N=&N12.)";
 define ARM2AGE1 / display "<18yo*(N=&N21.)";
 define ARM2AGE2 / display ">=18yo*(N=&N22.)";
run;

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

How to Concatenate Values

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 5 replies
  • 872 views
  • 1 like
  • 4 in conversation