DATA Step, Macro, Functions and more

Creating multiple variables based on the condition of a single existing variable

Reply
Frequent Contributor
Posts: 77

Creating multiple variables based on the condition of a single existing variable

I am trying to get demographic counts from a dataset.

The below example is just a portion of the dataset, but contains most of what I am trying to measure.

For each section of a class, I want to get the number of the different ethnicities, genders, colleges (to which the student belongs) and classification of the student.

Right now my method is rather "clunky" but it works.

I've tried a combination of arrays and do loops, but it didn't seem to like what I was trying.

Thank you for your time.

data have;

length id $2 composite $12 ethnic $1 gender $1 college $2 class $2;

    infile datalines dlm=',' dsd;

    input id $ composite $ ethnic $ gender $ college $ class $;

return;

datalines;

"01","MATH*4583*01",1,"M","AS","FR"

"02","MATH*4583*01",5,"F","AS","SO"

"03","MATH*4583*01",2,"M","HS","JR"

"04","MATH*4583*01",4,"F","PE","SR"

"05","MATH*4583*01",3,"F","N","PB"

"06","MATH*4583*01",6,"M","G","FR"

"07","MATH*4583*01",7,"M","G","FR"

"01","MATH*4583*02",1,"M","AS","FR"

"04","MATH*4583*02",4,"F","PE","SR"

"02","MATH*4583*02",1,"F","AS","SO"

"08","MATH*4583*02",8,"M","N","PB"

;

run;

proc sort data=have;

    by composite;

run;   

/*    This works, but surely it can be done better    */

data want;

    set have;

    by composite;

   

    if first.composite then do;

        section_headcount = 0;

        eth_1 = 0; eth_2 = 0; eth_3 = 0; eth_4 = 0;

        eth_5 = 0; eth_6 = 0; eth_7 = 0; eth_8 = 0;

        m = 0; f = 0;

        as = 0; hs = 0; pe = 0; n = 0; g = 0;

        fr = 0; so = 0; jr = 0; sr = 0; pb = 0;

    end;

    section_headcount + 1;

    if ethnic = '1' then eth_1 + 1;

    if ethnic = '2' then eth_2 + 1;

    if ethnic = '3' then eth_3 + 1;

    if ethnic = '4' then eth_4 + 1;

    if ethnic = '5' then eth_5 + 1;

    if ethnic = '6' then eth_6 + 1;

    if ethnic = '7' then eth_7 + 1;

    if ethnic = '8' then eth_8 + 1;

    if gender = 'M' then m + 1;

    if gender = 'F' then f + 1;

    if college = 'AS' then as + 1;

    if college = 'HS' then hs + 1;

    if college = 'PE' then pe + 1;

    if college = 'N' then n + 1;

    if college = 'G' then g + 1;

    if class = 'FR' then fr + 1;

    if class = 'SO' then so + 1;

    if class = 'JR' then jr + 1;

    if class = 'SR' then sr + 1;

    if class = 'PB' then pb + 1;

    if last.composite;

    drop ethnic id gender college class;

run;

Super User
Posts: 11,343

Re: Creating multiple variables based on the condition of a single existing variable

If you want counts then look to a report procedure. Assuming your variable composite is what you refere to as section of class then

proc freq data = have;

     tables composite *( ethnic  gender college  class) / norow nocol nopercent ;

run;

might give you what you are looking for.

If you need a dataset then provide how it should look.

Trusted Advisor
Posts: 1,228

Re: Creating multiple variables based on the condition of a single existing variable

Here is another way of doing it

proc tabulate data=have;

class composite ethnic gender college class;

table ethnic*gender*college all='Total',class*N=' ';

run;

Ask a Question
Discussion stats
  • 2 replies
  • 205 views
  • 0 likes
  • 3 in conversation