BookmarkSubscribeRSS Feed
Clara
Calcite | Level 5

I desperately need your help:

I am using proc tabulate to produce simple frequency tables.
Here, the overall non-missing have to be the 100%.

Example:

Yes                                      7   70.0%
No                                       3   30.0%
Missing                                2   20.0%
Overall (non-missing)       10 100.0%
TOTAL                               12  -------

I use a picture format to format all percentages more than 100%  with "-------".

But I have not succeeded to replace with "------" the percentages of missings.


Does anyone have a trick for this?


Thank you!
Clara

8 REPLIES 8
Ksharp
Super User

I do not understand your last sentence.

Whether the following output is what you want?

data test;
input patient sex $ Diabetes ;
cards;
1 M 1
2 M .
3 M 1
4 M 1
5 M 2
6 M 1
7 F .
8 F 2
9 F 2
10 F 2
11 F 1
12 F .
;
run;

proc format;
value diabetes 
.='Unknown'
1='Diabetic'
2='Non-diabetic'

;  
run;
ods pdf file='c:\x.pdf' style=sasweb;
proc report data=test nowd completerows out=see;
 column diabetes sex,(n percent);
 define diabetes /group format=diabetes. preloadfmt exclusive missing order=internal;
 define sex /across;
 define percent/'ColPctN' computed format=percent8.;
 compute before;
  sum1=_c2_ ;
  sum2=_c4_;
 endcomp;
 compute percent;
  if missing(diabetes) then do;
                               _sum1=sum1-_c2_;
                               _sum2=sum2-_c4_;
                            end;
     else do;
           _c3_=_c2_/_sum1;
           _c5_=_c4_/_sum2;
          end;
 endcomp; 
 compute after /style={just=right asis=on};
  str=cat('All :            ',sum1,'         100%             ',sum2,'       100%');
  line str $200.;
 endcomp;
run;
ods pdf close;


Ksharp

Clara
Calcite | Level 5

I want and must do it using proc tabulate. See my example:

data test;
input patnr yesno ;
cards;
1 1
2 .
3 1
4 1
5 2
6 2
7 .
8 2
9 2
10 2
11 1
12 .
;
run;
data test;
  set test;
   if yesno>.z then id=1;
run;


proc format;
value yesno_  (multilabel)

  .='Missing'
1,2=' Overall non-missing'
  1='  Yes'
  2=' No';

picture pct (round)        .-.z ='9.9' (noedit)
                              0 ='9.9' (mult=100 )
                      0<-0.009999='<0.01' (noedit)
                     0.01-0.99999='9.9' (mult=100 )
                          1-100='000.0'
                       101-high='----';
run;


proc tabulate data=test format=5.  missing order=formatted;
  var id ;
  class  yesno  / mlf;
  keyword n pctn all;

table   (yesno ='' all='TOTAL') ,
        (n='N' pctn<yesno*id all*id id>='%'*f=pct.)
          /rts=40
          box=[label=" "]
               printmiss misstext='0' row=float indent=3 contents='';

format   yesno yesno_. ;


run;

robby_beum
Quartz | Level 8

I too am having a hard time understanding your last sentence - I'm pretty dense ;o)

What happens when you use the bold text below in your code?

proc tabulate data=miss;

  class ptn visit;

  var score1;

  table ptn='Patient Id',

        mean=' '*score1='Drug A'* visit='Visit'/ misstext=[label="Missing"] RTS=25.;

  format visit vi.;

run;

Clara
Calcite | Level 5

I use proc tabulate (code above) to create a following table

                                           N    %

                                          Yes                                      4  44.4

                                          No                                        5  55.6

                                          Overall non-missing           9 100.0

                                          Missing                                3  33.3

                                          TOTAL                              12   ----

And what I want: replace the percents of missing with "----".

I hope, you could understand my problem now.

                                           

Nothing happens when I use misstext=[label="Missing"] .

art297
Opal | Level 21

Do you only need to do this for this one specific report this one time?  Or are you trying to develop code that will take care of all situations?

In the event that this is just a one time specific to this report problem, and if the percent missing is unique, you could always just capture it in your format statement.  e.g.:

data test;

input patnr yesno ;

cards;

1 1

2 .

3 1

4 1

5 2

6 2

7 .

8 2

9 2

10 2

11 1

12 .

;

run;

data test;

  set test;

   if yesno>.z then id=1;

run;

proc format;

value yesno_  (multilabel)

  .='Missing'

1,2=' Overall non-missing'

  1='  Yes'

  2=' No';

picture pct (round)        .-.z ='9.9' (noedit)

                              0 ='9.9' (mult=100 )

                      0<-0.009999='<0.01' (noedit)

                     0.01-0.99999='9.9' (mult=100 )

                          1-33.2999999='000.0'

                       33.29999991-33.333333339='----'

                        33.333333391-100='000.0'

                       101-high='----';

run;

proc tabulate data=test format=5.  missing order=formatted;

  var id ;

  class  yesno  / mlf;

  keyword n pctn all;

  table   (yesno ='' all='TOTAL') ,

        (n='N' pctn<yesno*id all*id id>='%'*f=pct.)

          /rts=40

          box=[label=" "]

               printmiss misstext='0' row=float indent=3 contents='';

format   yesno yesno_. ;

run;

Clara
Calcite | Level 5

I want that for all situations. Above was just an example to explain my problem.

ballardw
Super User

I think you are at a point where you need to show exactly what your desired output is not what you have currently done.

Ksharp
Super User

You can get it by using proc tabulate twice, if you don't mind.

data test;
input patnr yesno ;
cards;
1 1
2 .
3 1
4 1
5 2
6 2
7 .
8 2
9 2
10 2
11 1
12 .
;
run;
data test;
  set test;
   if yesno>.z then id=1;
run;


proc format;
value yesno_  (multilabel)

  .='Missing'
1,2=' Overall non-missing'
  1='  Yes'
  2=' No';

picture pct (round)        .-.z ='9.9' (noedit)
                              0 ='9.9' (mult=100 )
                      0<-0.009999='<0.01' (noedit)
                     0.01-0.99999='9.9' (mult=100 )
                          1-100='000.0'
                       101-high='----';
run;


proc tabulate data=test format=5.  missing order=formatted out=temp;
  var id ;
  class  yesno  / mlf;
  keyword n pctn all;

table   (yesno ='' all='TOTAL') ,
        (n='N' pctn='%'*f=pct.)
          /rts=40
          box=[label=" "]
               printmiss misstext='0' row=float indent=3 contents='';

format   yesno yesno_. ;
run;
data temp;
 set temp(rename=(n=_n));
 if yesno='Missing' then pctn_0=140;
 if missing(yesno) then yesno='TOTAL';
run;
proc tabulate data=temp;
 class yesno;
 var _n pctn_0;
 table yesno=' ',_n='N'*f=best. pctn_0='%'*format=pct.;
 keylabel sum=' ';
run;

Ksharp

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

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
  • 8 replies
  • 986 views
  • 0 likes
  • 5 in conversation