ponyhd
ponyhd

Reputation: 521

SAS create new variable based on format values from other variable

I would like to get to use the values of other variable as informat in SAS.

I have a variable item, and its value say group, I would like to create a new variable called desc.

data x;
 input item $ group;
 datalines;
 race 1
 race 2
 race 3
 gender 1
gender 2
;
run;

proc format;
 value race
1=White
2=Black
3=Other
;
gender
1=Female
2=male
;
run;

Ideally I would like to create variable desc using values from both item and group like this:

data y;
 set x;
 desc=put(item,group.);
run;

I wish to get:

item group desc
 race 1  White
 race 2  Black
 race 3  Other
 gender 1 Female
gender 2 male

Howerever, I get:

item group desc
 race 1  put(race,1.)
 race 2  put(race,2.)
  race 3  put(race,3.)
 gender 1 put(gender ,1.)
 gender 2  put(gender,2.)

Upvotes: 0

Views: 1460

Answers (3)

Lee
Lee

Reputation: 1427

You have to use PUTN. Also item and has to be swapped because item contains the format name.

data x;
 input item $ group;
 datalines;
 race 1
 race 2
 race 3
 gender 1
gender 2
;
run;

proc format;
 value race
1=White
2=Black
3=Other
;
value gender
1=Female
2=male
;
run;

data y;
 set x;
 desc=putn(group,item);
run;

Upvotes: 1

Richard
Richard

Reputation: 27508

You can create a format that maps a distinct concatenation of two values to a single description.

proc format;
  value $two_for_one
  'race:1' = 'white'
  'race:2' = 'black'
  'race:3' = 'other'
  'gender:1' = 'female'
  'gender:2' = 'male'

data want;
  set have;
  desc = put(catx(':',item,group), $two_for_one.);
run;

Upvotes: 1

Kiran
Kiran

Reputation: 3315

you were close.change your format statement it needs value for gender

  proc format;
 value race
 1=White
 2=Black
 3=Other
 ;
value gender
1=Female
2=male
;
run;


  data y;
  set x;
  if trim(item) ="race" then desc=put(group,race.);
  if trim(item) ="gender" then   desc=put(group,gender.);
   run;

Upvotes: 0

Related Questions