BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
mikemangini
Obsidian | Level 7

Hello SAS Community,

Does anyone know a way to call a variable based on the column location rather than the column name?

I would like to pass data sets to a macro procedure and run FREQ on the first 2 columns of the data set, however the names of these variables will vary. So my question is if I can identify the variables in the FREQ procedure without knowing the variable names.

PROC FREQ DATA =T1;

TABLE ColVar1 /OUT =T2;

TABLE ColVar2 /OUT =T3;

quit;

Thank you for your help.

Mike

1 ACCEPTED SOLUTION

Accepted Solutions
data_null__
Jade | Level 19

You would be better off with one data set of all the variables in one. ODS OUTPUT ONEWAYFREQS

%macro freqbynum(data=,num=2);
  
%local varlist;
   proc transpose data=&data(obs=0) out=varnames;
      var _all_;
      run;
   proc sql noprint;
      select catx(
' ','tables',_name_,cats('/ out=T',monotonic()),';') into :varlist separated by ' '
         from varnames(obs=&num);
      quit;
      run;
   proc freq data=&data;
      &varlist;
      run;
  
%mend;
options mprint=1;
%
freqbynum(data=sashelp.heart);

View solution in original post

5 REPLIES 5
data_null__
Jade | Level 19

This?

%macro freqbynum(data=,num=2);
  
%local varlist;
   proc transpose data=&data(obs=0) out=varnames;
      var _all_;
      run;
   proc sql noprint;
      select _name_ into :varlist separated by
' '
         from varnames(obs=&num);
      quit;
      run;
   proc freq data=&data;
      tables &varlist;
      run;
  
%mend;
%
freqbynum(data=sashelp.heart);
mikemangini
Obsidian | Level 7

This almost does what I was hoping perfectly. One last step though is that I would like to put the output from each variable out into its own table. Any ideas?

TABLE ColVar1 /OUT =T2;

TABLE ColVar2 /OUT =T3;

data_null__
Jade | Level 19

You would be better off with one data set of all the variables in one. ODS OUTPUT ONEWAYFREQS

%macro freqbynum(data=,num=2);
  
%local varlist;
   proc transpose data=&data(obs=0) out=varnames;
      var _all_;
      run;
   proc sql noprint;
      select catx(
' ','tables',_name_,cats('/ out=T',monotonic()),';') into :varlist separated by ' '
         from varnames(obs=&num);
      quit;
      run;
   proc freq data=&data;
      &varlist;
      run;
  
%mend;
options mprint=1;
%
freqbynum(data=sashelp.heart);
mikemangini
Obsidian | Level 7

Thank you so much for your solution. I will try ODS.

Ksharp
Super User

NULL , You can do it as simple as :

data _null_;
 dsid=open('sashelp.class','i');
 call symputx('first',varname(dsid,1));
 call symputx('second',varname(dsid,2));
run;
%put First is: &first | Second is: &second ;
proc freq data=sashelp.class;
table &first ;
table &second ;
run;

Xia Keshan

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

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
  • 11708 views
  • 5 likes
  • 3 in conversation