Help using Base SAS procedures

Understanding Call Symput!

Accepted Solution Solved
Reply
Super Contributor
Posts: 1,040
Accepted Solution

Understanding Call Symput!

In the below data _null_ code:

1)How can I get to see the logic???I used the following options and still I cant find the logic in the log

options MPRINT MLOGIC SYMBOLGEN;

2)What is the meaning of:

call symputx(cats('id',_n_),sex);   /*especially what is the _n_ doing here*/

Regards

proc sort data=sashelp.class(keep=sex) out=class nodupkey;
by sex;

run;

data _null_;
   set class end=last ;
   call symputx(cats('id',_n_),sex);
   if last then call symputx('n',_n_);
   run;


Accepted Solutions
Solution
‎04-04-2013 10:20 AM
Super Contributor
Posts: 1,636

Re: Understanding Call Symput!

Yes, it creates macro variables &id1,&id2,....;

example:

data have;
input sex$ ;
cards;
f
m
f
;
data _null_;
set have;
call symputx(cats('id',_n_),sex);
run;
%put &id1;
%put &id2;
%put &id3;

/* log file */

440  data have;
441  input sex$ ;
442  cards;

NOTE: The data set WORK.HAVE has 3 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


446  ;
447  data _null_;
448   set have;
449   call symputx(cats('id',_n_),sex);
450  run;

NOTE: There were 3 observations read from the data set WORK.HAVE.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds


451  %put &id1;
f
452  %put &id2;
m
453  %put &id3;
f

View solution in original post


All Replies
Super Contributor
Posts: 1,636

Re: Understanding Call Symput!

try this:

data class;

set sashelp.class;

postion_of_observation=_n_;

proc print;run;

Super Contributor
Posts: 1,040

Re: Understanding Call Symput!

I tried and it (_n_)gives the observation number....

I still could not understand :

call symputx(cats('id',_n_),sex);

Please correct me:

it is creating macro variables id concatenated with observation number and ??????

Regards

Respected Advisor
Posts: 3,777

Re: Understanding Call Symput!

Yes macro variables ID1 and ID2 with the values F and M respecfively.

Solution
‎04-04-2013 10:20 AM
Super Contributor
Posts: 1,636

Re: Understanding Call Symput!

Yes, it creates macro variables &id1,&id2,....;

example:

data have;
input sex$ ;
cards;
f
m
f
;
data _null_;
set have;
call symputx(cats('id',_n_),sex);
run;
%put &id1;
%put &id2;
%put &id3;

/* log file */

440  data have;
441  input sex$ ;
442  cards;

NOTE: The data set WORK.HAVE has 3 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


446  ;
447  data _null_;
448   set have;
449   call symputx(cats('id',_n_),sex);
450  run;

NOTE: There were 3 observations read from the data set WORK.HAVE.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds


451  %put &id1;
f
452  %put &id2;
m
453  %put &id3;
f

Super Contributor
Posts: 1,040

Re: Understanding Call Symput!

Thanks so much.

So far I was thinking only one macro variable can be created using call symput

But now I learnt that we can create as many variables as possible(for example if there are 10 observations under a particular variable we can create 10 macro variables......each macro variable getting the 10 value available under that variable????????

PLEASE CORRECT!!

Super Contributor
Posts: 578

Re: Understanding Call Symput!

You can create only one variable per statement.  That statement is being called for each record in the HAVE dataset.

Occasional Contributor
Posts: 8

Re: Understanding Call Symput!

Don't forget the last macro variable that's being created.  That would be "n".  The number of observations is being stored there.

Wes

Occasional Contributor
Posts: 8

Re: Understanding Call Symput!

Knowing how many macro variables are created will allow you to use a loop such as:

/*inside a macro of course*/

%do i = 1 %to &n;

  %put id&i = &&id&i;

%end;

Then you'll be able to see all the values that got assigned to the list of macro variables you created.  There are many other nice things you can do too.

Super Contributor
Posts: 1,040

Re: Understanding Call Symput!

Thanks a lot for the detailed information.

Also in the below what is the use of knowing the the number of observations???

data _null_;
   set class end=last ;
   call symputx(cats('id',_n_),sex);
   if last then call symputx('n',_n_);
   run;

Also the macro and a do looop you explained gives us the list of macro variables created and their assigned values right???????

Thanks

Occasional Contributor
Posts: 8

Re: Understanding Call Symput!

Well, there is a lot of information in this.  ID1 has the value for the first observation (assuming you don't re-order the data set).  ID127 has the value for the 127th observation.  "n" tells us how many macro variables were created.  If you want to access all the variables created then you'll need this number.

Yes, this will reveal the values of all the macro variables you just created.

Typically, I'll group things together so I can process things differently.  I wouldn't use the method you're asking about.  I assume this is just an example of how to create many different macro variables at once.  I can't really see how to use that.  I can always do the following:

In the end you'll have as many different data sets as you have different sexes.  All the sets will combine to recreate the original data set.

/* the loop won't run in open code */

PROC SQL;

DROP TABLE sex_count;

CREATE TABLE sex_count as

select distinct sex

from class

;

quit;

%let number_of_sexes = &sqlobs;

%do i = 1 %to &number_of_sexes;

  DATA _NULL_;

  x=&i;

  SET sex_count point=x;

  CALL SYMPUT('CDE_SEX', sex);

  stop;

  run;

  %put &CDE_SEX;

  PROC SQL;

  DROP TABLE _.&CDE_SEX;

  CREATE TABLE _.&CDE_SEX as

  select *

  from class

  where SEX = "&CDE_SEX"

  ;

  quit;

%end;

Another method to use is:

PROC SQL noprint;

SELECT sex

  into :id1 - :id&n

from class

;

quit;

But you'll need to define "n" ahead of time.

Maybe I put too much in here.

Super Contributor
Posts: 1,040

Re: Understanding Call Symput!

Thanks so much for your time...Its good to Know

Occasional Contributor
Posts: 8

Re: Understanding Call Symput!

Okay, I just re-read your original question.

The following will give you a data set in work that has only as many records as there are distinct values of sex.

proc sort data=sashelp.class(keep=sex) out=class nodupkey;
by sex;

run;

The following will create a macro variable for each unique value of sex.  If the only values are Male and Female then:

ID1 = Female

ID2 = Male

n = 2

Since this was sorted by sex (default is ascending) and F comes before M.

data _null_;
   set class end=last ;
   call symputx(cats('id',_n_),sex);
   if last then call symputx('n',_n_);
   run;

Super Contributor
Posts: 1,040

Re: Understanding Call Symput!

Thanks so much Wesley for your time abd help

Occasional Contributor
Posts: 12

Re: Understanding Call Symput!

Hi Robert,

Yes it is creating a macro variable Concatenating ID & the observation number and for the specific macro variable, it is assinging the value of SEX.

For example, See the result by using %put _user_ ;

GLOBAL ID10 M

GLOBAL ID1 M

GLOBAL ID11 F

GLOBAL ID2 F

GLOBAL ID12 F

GLOBAL ID3 F

GLOBAL ID13 F

GLOBAL ID4 F

GLOBAL ID14 F

GLOBAL ID5 M

GLOBAL ID15 M

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 18 replies
  • 693 views
  • 6 likes
  • 8 in conversation