我想创建一个包含三个变量的表,其中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%
这是我必须做很多次的事情,我需要在报告中用数字填充表格,所以我正在寻找一个可以一步打印表格的解决方案。
你会如何解决这个问题?
答案 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%*/