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

 I have a variable that has some, 1500 character categories, I want to create dummy variables for these categories. Is there any procedure I can use for the creating these variables. Manually it is quite a tiresome task.

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
SmcGarrett
Obsidian | Level 7

 

%macro cat(indata,outdata, variable);
  proc sql noprint;
   select distinct &variable. 
    into :mvals separated by '|'
    from &indata.;
    %let mdim=&sqlobs;
  quit;

  data &outdata.;
    set &indata.;
    %do _i=1 %to &mdim.;
      %let _v = %scan(&mvals., &_i., |);
      if VType(&variable)='C' then do;
         if &variable. = "&_v." then &_v. = 1;
         else &_v = 0;
      end;
      else do;
         if &variable. = &_v. then &_v. = 1;
         else &_v = 0;
            end;
    %end;
  run;
%mend;

This is the way I have my macro set up:

 

 

Run the macro and then just put the name of the input dataset , the name of the output dataset, and the variable which holds the values you are creating the dummy variables for. 

 

%cat(have,want,variable)

 

 

 

Edited at 10:51 PDT. Forgot a ; 

View solution in original post

8 REPLIES 8
ballardw
Super User

You will need to provide some more details. Are you looking to create one level of dummy for each level that appears in the variable? Multiple variables with 0 / 1 coding for some levels? Groups of like values?

 

You could provide a some examples of what you are doing manually to give us some idea.

munitech4u
Quartz | Level 8
So variable is like this:
var1
a
b
c
d
e
f
g

And I want in output dataset:
variables a,b,c,d,e,f,g and correponding dummy coded values as 1/0 wherever they are present/not present
stat_sas
Ammonite | Level 13

Hi,

 

 

Try proc glmmod with OUTDESIGN= to create dummy variables. 

SmcGarrett
Obsidian | Level 7

 

%macro cat(indata,outdata, variable);
  proc sql noprint;
   select distinct &variable. 
    into :mvals separated by '|'
    from &indata.;
    %let mdim=&sqlobs;
  quit;

  data &outdata.;
    set &indata.;
    %do _i=1 %to &mdim.;
      %let _v = %scan(&mvals., &_i., |);
      if VType(&variable)='C' then do;
         if &variable. = "&_v." then &_v. = 1;
         else &_v = 0;
      end;
      else do;
         if &variable. = &_v. then &_v. = 1;
         else &_v = 0;
            end;
    %end;
  run;
%mend;

This is the way I have my macro set up:

 

 

Run the macro and then just put the name of the input dataset , the name of the output dataset, and the variable which holds the values you are creating the dummy variables for. 

 

%cat(have,want,variable)

 

 

 

Edited at 10:51 PDT. Forgot a ; 

dsp1
Calcite | Level 5

In the above macro, I need to give variable name manually. But in some scenarios like I have 400 variables and out of those 400 variables, 90 variables are categorical variables. Then it's very difficult to check and picking all those variables.

 

Is there any code available to solve these kind of issues ?

 

Thanks in advance.

Ksharp
Super User

It is easy for IML.



proc iml;
use sashelp.class;
read all var {sex};
close;
vnames=unique(sex);
d=design(sex);
create want from d[r=sex c=vnames];
append from d[r=sex];
close;
quit;
proc print;run;

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
SAS Enterprise Guide vs. SAS Studio

What’s the difference between SAS Enterprise Guide and SAS Studio? How are they similar? Just ask SAS’ Danny Modlin.

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
  • 8 replies
  • 12628 views
  • 3 likes
  • 7 in conversation