Autumn
Autumn

Reputation: 585

How to show variable value by proc tabulate in sas?

How can I manage proc tabulate to show the value of a variable with missing value instead of its statistic? Thanks!

For example, I want to show the value of sym. It takes value 'x' or missing value. How can I do it?

Sample code:

data test;
input tx mod bm $ yr sym $;
datalines;
1   1   a   0   x
1   2   a   0   x
1   3   a   0   x
2   1   a   0   x
2   2   a   0   x
2   3   a   0   x
3   1   a   0   
3   2   a   0   
3   3   a   0   x
1   1   b   0   x
1   2   b   0   
1   3   b   0   
1   4   b   0   
1   5   b   0   
2   1   b   0   
2   2   b   0   
2   3   b   0   
2   4   b   0   
2   5   b   0   
3   1   b   0   x
3   2   b   0   
3   3   b   0   
1   1   c   0   
1   2   c   0   x
1   3   c   0   
2   1   c   0   
2   2   c   0   
2   3   c   0   
3   1   c   0   
3   2   c   0   
3   3   c   0   
1   3   a   1   x
2   3   a   1   
3   3   a   1   
1   3   b   1   
2   3   b   1   
3   3   b   1   
1   3   c   1   x
2   3   c   1   
3   3   c   1   
;
run;

proc tabulate data=test;
class yr bm tx mod ;
var sym;
table yr*bm, tx*mod;
run;

I want the final table to be like this. Thanks!

Upvotes: 1

Views: 623

Answers (1)

Joe
Joe

Reputation: 63424

proc tabulate data=test;
class tx mod bm  yr sym;
table yr*bm, tx*mod*sym*n;
run;

That gives you ones for each SYM=x (since n=missing). That hides the rows for SYM=missing, hence you miss some values overall from your example table. (You could format the column with a format that defines 1 = 'x' easily).

proc tabulate data=test;
class tx mod bm  yr;
class sym /missing;
table yr*bm, tx*mod*sym=' '*n;
run;

That gives you all of your combinations of the 4 main variables, but includes missing syms as their own column.

If you want to have your cake and eat it too, then you need to redefine SYM to be a numeric variable, so you can use it as a VAR.

proc format;
invalue ISYM
x=1
;
value FSYM
1='x';
quit;

data test;
infile datalines truncover;
input tx mod bm $ yr sym :ISYM.;
format sym FSYM.;
datalines;
1   1   a   0   x
1   2   a   0   x
1   3   a   0   x
... more lines ...
;
run;

proc tabulate data=test;
class tx mod bm  yr;
var sym;
table yr*bm, tx*mod*sym*sum*f=FSYM.;
run;

All of these assume these are unique combination rows. If you start having multiples of yr*bm*tx*mod, you would have a problem here as this wouldn't give you the expected result (sum 1+1+1=3 would not give you an 'x').

Upvotes: 2

Related Questions