SAS PROC TABULATE具有缺失值的多个类变量的百分比

时间:2015-12-15 21:26:18

标签: sas

我想创建一个包含三个变量的表,其中var2是var1的百分比,var3是var2的百分比,由具有缺失值的类变量细分。

要解释一下,想象一下,我有数据显示谁申请,接受采访,并被雇用工作,例如

data job; 
input applied interviewed hired; 
datalines; 
1   1   1
1   1   1
1   1   1
1   1   0
1   1   0
1   1   0
1   0   .
1   0   .
1   0   .
1   0   .
; 
run; 

创建一个表格可以很容易地显示应用者的数量,然后是受访者的百分比,然后是那些人的百分比,被雇用的百分比。

proc tabulate data = job; 
var applied interviewed hired; 
tables applied * n (interviewed hired) * mean * f=percent6.; 
run; 

给出:

applied interviewed hired 
   10        60%     50% 

现在我想通过缺少值的几个类变量来解决这个问题。

data have; 
input sex degree exp applied interviewed hired; 
datalines; 
0   1   1   1   1   1
1   .   0   1   1   1
.   0   1   1   1   1
0   1   0   1   1   0
1   0   1   1   1   0
0   1   0   1   1   0
1   .   1   1   0   .
0   1   .   1   0   .
.   0   0   1   0   .
1   0   0   1   0   .
; 
run; 

如果我一次做一个类变量,它会给我正确的百分比:

proc tabulate data = have format = 6.; 
    class sex; 
    var applied interviewed hired; 
    tables sex, applied * sum (interviewed hired) * mean * f=percent6.; 
run; 

有没有办法一次在表格中完成所有三个类变量,并为每个类别获得正确的百分比。所以表格如下:

       applied  interviewed  hired
sex 
  0       4        75%       33%
  1       4        50%       50%
degree  
  0       4        50%       50%
  1       4        75%       33%
exp 
  0       5        60%       33%
  1       4        75%       67%

这是我必须做很多次的事情,我需要在报告中用数字填充表格,所以我正在寻找一个可以一步打印表格的解决方案。

你会如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您遇到的问题是缺少数据。当任何类变量缺少一个案例时,它将从整个表中删除,除非您在proc调用中指定MISSING。所以,例如,你没有采访的第四性别= 0缺少EXP;所以他们没有在桌子上露面,尽管你希望它们出现在SEX中。

您可以获得正确的数字,主要是:

proc tabulate data = have format = 6. missing; 
    class sex degree exp; 
    var applied interviewed hired; 
    tables (sex degree exp), applied * sum (interviewed hired) * mean * f=percent6.; 
run; 

但是,您有一个额外的行,其中包含缺少数据的行。您无法从打印输出中消除这些行,同时还将其包含在其他类计算中;这只是SAS制表的局限之一。其他PROC也有类似的问题;如果生成多个表,PROC FREQ是唯一不执行此操作的人,但即使这样在一个表中(与星号结合),您也会遇到相同的问题。

我找到的唯一方法是将表输出到数据集,然后过滤掉这些行,然后PROC REPORT或PRINT或TABULATE数据。

答案 1 :(得分:0)

我认为这接近你想要的。您必须修复行标签,但这是一个PROC TABULATE步骤。

title;
data have; 
input sex degree exp applied interviewed hired; 
datalines; 
0   1   1   1   1   1
1   .   0   1   1   1
.   0   1   1   1   1
0   1   0   1   1   0
1   0   1   1   1   0
0   1   0   1   1   0
1   .   1   1   0   .
0   1   .   1   0   .
.   0   0   1   0   .
1   0   0   1   0   .
; 
run; 
proc print;
   run;

proc summary data=have missing ;
   class sex degree exp;
   ways 1;
   output out=stats sum(applied)= mean(interviewed hired)= / levels;
   run;

data stats2;
   set stats;
   if n(of sex degree exp) eq 0 then delete;
   run;
proc print;
   run;
proc tabulate data=stats2;
   class _type_ / descend;
   class _level_;
   var applied interviewed hired;
   tables (_type_*_level_),applied*sum='N'*f=8. (interviewed hired)*sum='Percent'*f=percent6.;
   run;


/**/
/*       applied  interviewed  hired*/
/*sex */
/*  0       4        75%       33%*/
/*  1       4        50%       50%*/
/*degree  */
/*  0       4        50%       50%*/
/*  1       4        75%       33%*/
/*exp */
/*  0       5        60%       33%*/
/*  1       4        75%       67%*/

enter image description here