PriyamK
PriyamK

Reputation: 141

Deleting and adding specific row/ column in SAS output

I have the following data

DATA HAVE;
input year dz $8. area;
cards;
2000 stroke 08
2000 stroke 06
2000 stroke 06
;
run;

After using proc freq

proc freq data=have;
table area*dz/ list nocum ;
run;

I get the below output

enter image description here

In this output

  1. I want to delete the 'dz', what can I do to delete this column?

  2. I want a row in the end that gives 'total', what can I do to get a 'total' row?

Thank you!

Upvotes: 0

Views: 563

Answers (3)

PriyamK
PriyamK

Reputation: 141

Thank you all for your valuable responses. The following code gives me the desired output in a concise way

proc freq data=HAVE;
  tables area / list nocum out=a;
run; 


proc sql;
    create table b as
    select * from a
union 
select
           'Total' as area,
           sum(count) as count,
                  sum(percent) as percent
    FROM a
;
quit;

proc print data=b; run;

enter image description here

Upvotes: 0

Richard
Richard

Reputation: 27516

You should subset your data with a where clause and use a title statement if a important partitioning variable is to be removed from output. If you didn't subset how would your audience know if a count contained say episodes of stroke and ministroke if ministroke was also in the data.

Compute the frequencies with freq and use a reporting procedure (print, report, tababulate) that summarizes to show a total line.

Example:

data have;
input year dz $ area;
cards;
2000 stroke 08
2000 stroke 06
2000 stroke 06
;

proc freq noprint data=have;
  where dz = 'stroke';
  table area / out=freqs;
run;

title 'Stroke dz';
title2 'print';

proc print data=freqs noobs label;
  var area;
  sum count percent;
run;

title2 'report';
proc report data=freqs;
  columns area count percent;
  define area / display;
  define count / analysis;
  rbreak after / summarize;
run;

title2 'tabulate';
proc tabulate data=freqs;
  class area;
  var count percent;
  table area all, count percent;
run;

enter image description here

Upvotes: 1

Kermit
Kermit

Reputation: 3117

There must be a better way of doing this, but the following code creates the desired table:

data have;
input year dz $8. area;
cards;
2000 stroke 08
2000 stroke 06
2000 stroke 06
;
run;

ods output List=list;
proc freq data=have;
table area*dz / list;
run;

data stage1;
    set list(keep= area frequency percent CumFrequency CumPercent) end=eof;
    area_char = put(area,best.-l); /* Convert it to char to add the Total row */
    if eof then do;
        call symputx("cumFreq", cumfrequency);
        call symputx("cumPerc", cumpercent);
    end;
    drop area;
run;

data want;
    retain area frequency percent; /* Put the variables in the desired order */
    set stage1(rename=(area_char=area) drop=cumfrequency cumpercent) end=eof;
    output;
    if eof then do; /* Manually create the Total row */
        area = "Total";
        Frequency = &cumfreq.;
        Percent = &cumperc.;
        output;
    end;
run;

Output (want table):

enter image description here

Upvotes: 1

Related Questions