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

Hello everyone,

I’m new to SAS and have been trying to figure out how to solve the following problem:

Let’s assume I have the following dataset:

 

data specialty;

  input  ID  specialty $12. ;

  cards;

1 Neurologist

1 Psychologist

2 GP

3 Neurologist

4 Cardiologist

5 Cardiologist

;

run;

 

What I want to do now is to create a new column for every physician specialty from the column “specialty” and put a “1” in the respective column if it fits and zero otherwise.

So the result should look like this:

ID

specialty

Neurologist

Psychologist

GP

Cardiologist

1

Neurologist

1

0

0

0

1

Psychologist

0

1

0

0

2

GP

0

0

1

0

3

Neurologist

1

0

0

0

4

Cardiologist

0

0

0

1

5

Cardiologist

0

0

0

1

 

I solved the problem with creating every variable manually and lots of “if then statements” for now but I’m not very happy with this. Is there a more elaborated way to achieve the desired outcome?

Thank you!

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User
data specialty;
input  ID  specialty $12. ;
x = 1;
cards;
1 Neurologist
1 Psychologist
2 GP
3 Neurologist
4 Cardiologist
5 Cardiologist
;
run;
proc transpose data=specialty out=wide (drop=_NAME_);
by ID;
id specialty;
var x;
run;

This basically provides what you wanted (having missing values instead of zero), but you only get 1 observation for ID=1, where both columns Neuroloigist and Psychologist have the value 1.

View solution in original post

5 REPLIES 5
Kurt_Bremser
Super User
data specialty;
input  ID  specialty $12. ;
x = 1;
cards;
1 Neurologist
1 Psychologist
2 GP
3 Neurologist
4 Cardiologist
5 Cardiologist
;
run;
proc transpose data=specialty out=wide (drop=_NAME_);
by ID;
id specialty;
var x;
run;

This basically provides what you wanted (having missing values instead of zero), but you only get 1 observation for ID=1, where both columns Neuroloigist and Psychologist have the value 1.

D1
Calcite | Level 5 D1
Calcite | Level 5

Thank you Kurt and RW9 for the quick responses. That is exactly what I needed!

LinusH
Tourmaline | Level 20

Looks like a report to me. What is the intended use for the output data set?

I believe you can use cross tabulations in PROC FREQ for this.

Data never sleeps
RW9
Diamond | Level 26 RW9
Diamond | Level 26

Well, this will give you what you want:

data specialty;
  input  ID  specialty $12. ;
  res=1;
  cards;
1 Neurologist
1 Psychologist
2 GP
3 Neurologist
4 Cardiologist
5 Cardiologist
;
run;

proc transpose data=specialty out=want;
  by id specialty;
  var res;
  id specialty;
  idlabel specialty;
run;

However I would advise against this approach, if you variables change then your going to need to reprogram.  Its generally a good idea to have a general prefix and an incrementor so you can use arrays, you can still label them what ever your like, but its so much easier to code with:

data specialty;
  input  ID  specialty $12. ;
  res=1;
  cards;
1 Neurologist
1 Psychologist
2 GP
3 Neurologist
4 Cardiologist
5 Cardiologist
;
run;

data want;
  set specialty;
  array var{4} 8.;
  select(specialty);
    when ("Neurologist") var{1}=1;
    when ("Psychologist") var{2}=1;
    when ("GP") var{3}=1;
    when ("Cardiologist") var{4}=1;
    otherwise;
  end;
run;

You can then refer to the array of vars in further processing.

Ksharp
Super User

 

data specialty;
input  ID  specialty $12. ;
x = 1;
n+1;
cards;
1 Neurologist
1 Psychologist
2 GP
3 Neurologist
4 Cardiologist
5 Cardiologist
;
run;
proc transpose data=specialty out=wide (drop=_NAME_ n);
by n;
id specialty;
var x;
copy id specialty;
run;
proc stdize data=wide out=want missing=0 reponly;run;

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 5 replies
  • 1558 views
  • 1 like
  • 5 in conversation