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

Hello -

I am working with SAS EG, and my data looks like the data in the file as long. I need to convert that data into wide as in the file.

 

Thank you, and stay safe

 

1 ACCEPTED SOLUTION

Accepted Solutions
RichardDeVen
Barite | Level 11

You can perform the reshaping with two TRANSPOSE steps with an intermediate DATA step.

 

Example:

 

data have;
input 
ID	FirstCount	FirstSales	SecondCount	SecondSales	ThirdCount	ThirdSales	FourthCount	FourthSales;
informat firstsales secondsales thirdsales fourthsales dollar12.;
  format firstsales secondsales thirdsales fourthsales dollar12.;
datalines;
1	23	 $156 	 25 	 $65,147 	89	 $215,654 	5	 $215 
2	38	 $107,964 	 17 	 $123,032 	0	 $-   	520	 $138,101 
3	0	 $-   	 -   	 $-   	151	 $514,785 	0	 $-   
;

proc transpose data=have out=stage1;
  by id;
run;

data stage2;
  set stage1;
  length type $27;
  type = prxchange('s/(count|sales)//i', 1, _name_);
  var = tranwrd(_name_, trim(type), '');
run;

proc transpose data=stage2 out=want(drop=_name_);
  by id type notsorted;
  id var;
  var col1;
  format sales dollar12.;
run;

 Similar process to revert to the original shape

* and back again;

data have;
  set want;
run;

proc transpose data=have out=stage1;
  by id type notsorted;
run;

data stage2;
  set stage1;
  _newname_ = cats(type,_name_);
run;

proc transpose data=stage2 out=want(drop=_name_);
  by id;
  id _newname_;
run;

Note:  The OP image shows wide and long not consistent to question.

In general, if you have tall categorical data, a reshaping into the 'wide' shape the task is more a reporting issue than a data transformation issue.  Proc TABULATE or REPORT are great for presenting the categorical data in any desired shape.

 

ods html file='wide.html';
proc tabulate data=tall;
  class id type / order=data;
  var count sales;
  table id='', type='' * (count*sum=''*format=8. sales*sum=''*format=dollar12.) / box='ID';
run;

proc report data=tall;
  column id type,(count sales);
  define id/group;
  define type/across order=data;
run;

ods html close;

View solution in original post

2 REPLIES 2
RichardDeVen
Barite | Level 11

You can perform the reshaping with two TRANSPOSE steps with an intermediate DATA step.

 

Example:

 

data have;
input 
ID	FirstCount	FirstSales	SecondCount	SecondSales	ThirdCount	ThirdSales	FourthCount	FourthSales;
informat firstsales secondsales thirdsales fourthsales dollar12.;
  format firstsales secondsales thirdsales fourthsales dollar12.;
datalines;
1	23	 $156 	 25 	 $65,147 	89	 $215,654 	5	 $215 
2	38	 $107,964 	 17 	 $123,032 	0	 $-   	520	 $138,101 
3	0	 $-   	 -   	 $-   	151	 $514,785 	0	 $-   
;

proc transpose data=have out=stage1;
  by id;
run;

data stage2;
  set stage1;
  length type $27;
  type = prxchange('s/(count|sales)//i', 1, _name_);
  var = tranwrd(_name_, trim(type), '');
run;

proc transpose data=stage2 out=want(drop=_name_);
  by id type notsorted;
  id var;
  var col1;
  format sales dollar12.;
run;

 Similar process to revert to the original shape

* and back again;

data have;
  set want;
run;

proc transpose data=have out=stage1;
  by id type notsorted;
run;

data stage2;
  set stage1;
  _newname_ = cats(type,_name_);
run;

proc transpose data=stage2 out=want(drop=_name_);
  by id;
  id _newname_;
run;

Note:  The OP image shows wide and long not consistent to question.

In general, if you have tall categorical data, a reshaping into the 'wide' shape the task is more a reporting issue than a data transformation issue.  Proc TABULATE or REPORT are great for presenting the categorical data in any desired shape.

 

ods html file='wide.html';
proc tabulate data=tall;
  class id type / order=data;
  var count sales;
  table id='', type='' * (count*sum=''*format=8. sales*sum=''*format=dollar12.) / box='ID';
run;

proc report data=tall;
  column id type,(count sales);
  define id/group;
  define type/across order=data;
run;

ods html close;
altijani
Quartz | Level 8

Thanks.

My data is currently long as in your second code. I need it to be as in your first shape.

sas-innovate-white.png

Special offer for SAS Communities members

Save $250 on SAS Innovate and get a free advance copy of the new SAS For Dummies book! Use the code "SASforDummies" to register. Don't miss out, May 6-9, in Orlando, Florida.

 

View the full agenda.

Register now!

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
  • 2 replies
  • 1988 views
  • 0 likes
  • 2 in conversation