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

I am trying to create the table using proc report but the order seems changed but I have no idea why and how to solve it.

 

Here are my codes:

 

data test;
infile datalines dlm=",";
informat x $10.
         y $20.
         z $20.
		 group $20.
         description $20.;
input x $ y $ z $ group $  description $;
datalines;
X,A,Total (N=2000),Total,709 (35.5 %)
X,B,Total (N=2000),Total,190 (9.5 %)
X,C,Total (N=2000),Total,2 (0.1 %)
X,A,0 (N=57),Total,23 (40.4 %)
X,B,0 (N=57),Total,4 (7 %)
X,C,0 (N=57),Total,0 (0 %)
X,A,I (N=393),Total,155 (39.4 %)
X,B,I (N=393),Total,29 (7.4 %)
X,C,I (N=393),Total,0 (0 %)
X,A,II (N=551),Total,188 (34.1 %)
X,B,II (N=551),Total,52 (9.4 %)
X,C,II (N=551),Total,0 (0 %)
X,A,Total (N=1520),0,537 (35.3 %)
X,B,Total (N=1520),0,138 (9.1 %)
X,C,Total (N=1520),0,2 (0.1 %)
X,A,0 (N=57),0,23 (40.4 %)
X,B,0 (N=57),0,4 (7 %)
X,C,0 (N=57),0,0 (0 %)
X,A,I (N=349),0,138 (39.5 %)
X,B,I (N=349),0,25 (7.2 %)
X,C,I (N=349),0,0 (0 %)
X,A,II (N=424),0,145 (34.2 %)
X,B,II (N=424),0,42 (9.9 %)
X,C,II (N=424),0,0 (0 %)
X,A,Total (N=480),1,172 (35.8 %)
X,B,Total (N=480),1,52 (10.8 %)
X,C,Total (N=480),1,0 (0%)
X,A,I (N=44),1,17 (38.6 %)
X,B,I (N=44),1,4 (9.1 %)
X,C,I (N=44),1,0 (0%)
X,A,II (N=127),1,43 (33.9 %)
X,B,II (N=127),1,10 (7.9 %)
X,C,II (N=127),1,0 (0%)
;
run;

proc report data=test missing;
column x  y  group, (z, description);
define x/' ' group order=data;
define y/' ' group order=data;
define z/' ' order=data across ;
define group/' ' order=data across nozero;
define description/ ' ' group ;
run;

 

 

And the output looks like

 

11.PNG

 

 

But I would like it to be the following where the total one is ahead of the 0 term.

 

22.PNG

 

Any solution for solving it?

Thanks!

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
Cynthia_sas
SAS Super FREQ

Hi:

  If you want to use ORDER=DATA, then the data in the DATALINES has to be in the correct order. I restructured your DATALINES a bit and added a COL_ORD variable, so the pattern of the data was a bit more obvious. If you want the Total column to ALWAYS appear before the 0 column, then the data has to be organized that way. Here's what I generated with the changed data and slightly changed code:

report_across_dummyvar.png

 

  Also, I changed the code in these ways:

1) I never name a variable "GROUP" (or ORDER or COMPUTED, since those are PROC REPORT usages)-- so I changed it to GRP

2) I took off MISSING and NOZERO and used NOCOMPLETECOLS instead

3) a better way to put a character string under an ACROSS item is to put one numeric variable at the end of the report row (in this case, DUMMY) and then use NOPRINT so the dummy values are not visible--but, that way, PROC REPORT has a numeric value to collapse for the GROUP items.

 

Hope this helps,

Cynthia

 

The code:

data test;
  length x $10 y $20 grp $20 z $20 description $20;
  infile datalines dlm="," dsd;
 input x $ y $ grp $ z $ description $ col_ord;
datalines;
X,A,Total,Total (N=2000),709 (35.5 %),1.1
X,A,0,Total (N=1520),537 (35.3 %),2.1
X,A,1,Total (N=480),172 (35.8 %),3.1
X,A,Total,0 (N=57),23 (40.4 %),1.2
X,A,0,0 (N=57),23 (40.4 %),2.2
X,A,1,I (N=44),17 (38.6 %),3.2
X,A,Total,I (N=393),155 (39.4 %),1.3
X,A,0,I (N=349),138 (39.5 %),2.3
X,A,1,II (N=127),43 (33.9 %),3.3
X,A,Total,II (N=551),188 (34.1 %),1.4
X,A,0,II (N=424),145 (34.2 %),2.4
X,B,Total,Total (N=2000),190 (9.5 %),1.1
X,B,0,Total (N=1520),138 (9.1 %),2.1
X,B,1,Total (N=480),52 (10.8 %),3.1
X,B,Total,0 (N=57),4 (7 %),1.2
X,B,0,0 (N=57),4 (7 %),2.2
X,B,1,I (N=44),4 (9.1 %),3.2
X,B,Total,I (N=393),29 (7.4 %),1.3
X,B,0,I (N=349),25 (7.2 %),2.3
X,B,1,II (N=127),10 (7.9 %),3.3
X,B,Total,II (N=551),52 (9.4 %),1.4
X,B,0,II (N=424),42 (9.9 %),2.4
X,C,Total,Total (N=2000),2 (0.1 %),1.1
X,C,Total,0 (N=57),0 (0 %),1.2
X,C,Total,I (N=393),0 (0 %),1.3
X,C,Total,II (N=551),0 (0 %),1.4
X,C,0,Total (N=1520),2 (0.1 %),2.1
X,C,0,0 (N=57),0 (0 %),2.2
X,C,0,I (N=349),0 (0 %),2.3
X,C,0,II (N=424),0 (0 %),2.4
X,C,1,Total (N=480),0 (0%),3.1
X,C,1,I (N=44),0 (0%),3.2
X,C,1,II (N=127),0 (0%),3.3
;
run;

title;
proc report data=test nocompletecols;
column x  y  grp,(z, description) dummy;
define x/' ' group  ;
define y/' ' group  ;
define grp/' '  across order=data ;
define z/' '   across order=data;
define description/ ' ' display;
define dummy / computed ' ' noprint;
compute dummy;
  dummy=1;
endcomp;
run;

View solution in original post

4 REPLIES 4
Cynthia_sas
SAS Super FREQ

Hi:

  If you want to use ORDER=DATA, then the data in the DATALINES has to be in the correct order. I restructured your DATALINES a bit and added a COL_ORD variable, so the pattern of the data was a bit more obvious. If you want the Total column to ALWAYS appear before the 0 column, then the data has to be organized that way. Here's what I generated with the changed data and slightly changed code:

report_across_dummyvar.png

 

  Also, I changed the code in these ways:

1) I never name a variable "GROUP" (or ORDER or COMPUTED, since those are PROC REPORT usages)-- so I changed it to GRP

2) I took off MISSING and NOZERO and used NOCOMPLETECOLS instead

3) a better way to put a character string under an ACROSS item is to put one numeric variable at the end of the report row (in this case, DUMMY) and then use NOPRINT so the dummy values are not visible--but, that way, PROC REPORT has a numeric value to collapse for the GROUP items.

 

Hope this helps,

Cynthia

 

The code:

data test;
  length x $10 y $20 grp $20 z $20 description $20;
  infile datalines dlm="," dsd;
 input x $ y $ grp $ z $ description $ col_ord;
datalines;
X,A,Total,Total (N=2000),709 (35.5 %),1.1
X,A,0,Total (N=1520),537 (35.3 %),2.1
X,A,1,Total (N=480),172 (35.8 %),3.1
X,A,Total,0 (N=57),23 (40.4 %),1.2
X,A,0,0 (N=57),23 (40.4 %),2.2
X,A,1,I (N=44),17 (38.6 %),3.2
X,A,Total,I (N=393),155 (39.4 %),1.3
X,A,0,I (N=349),138 (39.5 %),2.3
X,A,1,II (N=127),43 (33.9 %),3.3
X,A,Total,II (N=551),188 (34.1 %),1.4
X,A,0,II (N=424),145 (34.2 %),2.4
X,B,Total,Total (N=2000),190 (9.5 %),1.1
X,B,0,Total (N=1520),138 (9.1 %),2.1
X,B,1,Total (N=480),52 (10.8 %),3.1
X,B,Total,0 (N=57),4 (7 %),1.2
X,B,0,0 (N=57),4 (7 %),2.2
X,B,1,I (N=44),4 (9.1 %),3.2
X,B,Total,I (N=393),29 (7.4 %),1.3
X,B,0,I (N=349),25 (7.2 %),2.3
X,B,1,II (N=127),10 (7.9 %),3.3
X,B,Total,II (N=551),52 (9.4 %),1.4
X,B,0,II (N=424),42 (9.9 %),2.4
X,C,Total,Total (N=2000),2 (0.1 %),1.1
X,C,Total,0 (N=57),0 (0 %),1.2
X,C,Total,I (N=393),0 (0 %),1.3
X,C,Total,II (N=551),0 (0 %),1.4
X,C,0,Total (N=1520),2 (0.1 %),2.1
X,C,0,0 (N=57),0 (0 %),2.2
X,C,0,I (N=349),0 (0 %),2.3
X,C,0,II (N=424),0 (0 %),2.4
X,C,1,Total (N=480),0 (0%),3.1
X,C,1,I (N=44),0 (0%),3.2
X,C,1,II (N=127),0 (0%),3.3
;
run;

title;
proc report data=test nocompletecols;
column x  y  grp,(z, description) dummy;
define x/' ' group  ;
define y/' ' group  ;
define grp/' '  across order=data ;
define z/' '   across order=data;
define description/ ' ' display;
define dummy / computed ' ' noprint;
compute dummy;
  dummy=1;
endcomp;
run;
KK13680
Fluorite | Level 6

Hi Cynthia,

 

It looks great! But can I know how did you reorganized the data? It seems for data with y=C, the order of grp and z is different with those with y=A or y=B.

 

Thanks!

Cynthia_sas
SAS Super FREQ

Yes, that was my mistake in copy and paste, but as you saw, it did not make a difference. Once the "pattern" was set for y=A, PROC REPORT would use that pattern for y=B and y=C -- although in my mind, it would be far better from a maintenance standpoint for the datalines to be consistent.
Sorry, here's the revised code:

data test2;
  length x $10 y $20 grp $20 z $20 description $20;
  infile datalines dlm="," dsd;
 input x $ y $ grp $ z $ description $ col_ord;
datalines;
X,A,Total,Total (N=2000),709 (35.5 %),1.1
X,A,0,Total (N=1520),537 (35.3 %),2.1
X,A,1,Total (N=480),172 (35.8 %),3.1
X,A,Total,0 (N=57),23 (40.4 %),1.2
X,A,0,0 (N=57),23 (40.4 %),2.2
X,A,1,I (N=44),17 (38.6 %),3.2
X,A,Total,I (N=393),155 (39.4 %),1.3
X,A,0,I (N=349),138 (39.5 %),2.3
X,A,1,II (N=127),43 (33.9 %),3.3
X,A,Total,II (N=551),188 (34.1 %),1.4
X,A,0,II (N=424),145 (34.2 %),2.4
X,B,Total,Total (N=2000),190 (9.5 %),1.1
X,B,0,Total (N=1520),138 (9.1 %),2.1
X,B,1,Total (N=480),52 (10.8 %),3.1
X,B,Total,0 (N=57),4 (7 %),1.2
X,B,0,0 (N=57),4 (7 %),2.2
X,B,1,I (N=44),4 (9.1 %),3.2
X,B,Total,I (N=393),29 (7.4 %),1.3
X,B,0,I (N=349),25 (7.2 %),2.3
X,B,1,II (N=127),10 (7.9 %),3.3
X,B,Total,II (N=551),52 (9.4 %),1.4
X,B,0,II (N=424),42 (9.9 %),2.4
X,C,Total,Total (N=2000),2 (0.1 %),1.1
X,C,0,Total (N=1520),2 (0.1 %),2.1
X,C,1,Total (N=480),0 (0%),3.1
X,C,Total,0 (N=57),0 (0 %),1.2
X,C,0,0 (N=57),0 (0 %),2.2
X,C,1,I (N=44),0 (0%),3.2
X,C,Total,I (N=393),0 (0 %),1.3
X,C,0,I (N=349),0 (0 %),2.3
X,C,1,II (N=127),0 (0%),3.3
X,C,Total,II (N=551),0 (0 %),1.4
X,C,0,II (N=424),0 (0 %),2.4
;
run;

title;
proc report data=test2 nocompletecols;
column x  y  grp,(z, description) dummy;
define x/' ' group  ;
define y/' ' group  ;
define grp/' '  across order=data ;
define z/' '   across order=data;
define description/ ' ' display;
define dummy / computed ' ' noprint;
compute dummy;
  dummy=1;
endcomp;
run;


and as you can see the output is the same. FYI -- here's how I patterned the data -- so that the x.1 columns appeared first, followed by the x.2 columns, then the x.3 columns then the x.4 columns.

same_output.png


Cynthia

KK13680
Fluorite | Level 6
Thank you very much. I really appreciate your help!

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

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.

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
  • 4 replies
  • 518 views
  • 2 likes
  • 2 in conversation