我将单独回答这个问题,因为这是在回答问题的其他可能解释;当它澄清时,我会删除一个或另一个。
如果您希望在单个 打印 表中使用它,那么您要么需要使用 proc tabulate,要么需要对数据进行规范化 - 即以 variable | value 的形式放置它。 PROC FREQ 不能在一个表中处理多个单向频率。
对于PROC TABULATE,您的问题可能是缺少数据。将检查class 语句中的任何变量是否缺失,如果任何行缺少任何类变量的数据,则这些行将完全从所有变量的列表中排除。
您可以通过在class 语句、table 语句或proc tabulate 语句中添加missing 选项来覆盖它。所以:
PROC TABULATE DATA = BCanalysis;
CLASS ERstatus PRstatus Race TumorStage InsuranceStatus/missing;
TABLE (ERstatus PRstatus Race TumorStage) * (N COLPCTN), InsuranceStatus;
RUN;
这将导致外观与您的表格略有不同,因为它会在您可能不想要它们的地方包含缺失的行,并且它们将被考虑到 @ 987654330@ 你可能又不想要它们了。
通常需要进行一些操作;最简单的方法是标准化您的数据,然后针对该标准化数据集运行制表(使用PROC TABULATE 或PROC FREQ,以更合适的为准;TABULATE 具有更好的百分比选项)。
假设我们有这个:
data class;
set sashelp.class;
if _n_=5 then call missing(age);
if _n_=3 then call missing(sex);
run;
我们希望这两个表在一个表中。
proc freq data=class;
tables age sex;
run;
如果我们这样做:
proc tabulate data=class;
class age sex;
tables (age sex),(N colpctn);
run;
然后我们得到两个子表的总数 N=17 - 这不是我们想要的,我们想要 N=18。然后我们可以这样做:
proc tabulate data=class;
class age sex/missing;
tables (age sex),(N colpctn);
run;
但这也不完全正确;我希望 F 有 8/18 = 44.44% 和 M 10/18 = 55.55%,而不是 42% 和 53%,其中 5% 分配给缺失的行。
我这样做的方法是规范化数据。这意味着您将获得一个包含 2 个变量的数据集,varname 和 val,或者对您的数据有意义的任何内容,以及您可能拥有的任何标识符/人口统计/whatnot 变量。 val 必须是字符,除非您的所有值都是数字。
例如,在这里我用age 和sex 变量规范化class。我不保留任何标识符,但您当然可以在您的数据中,我想InsuranceStatus 会保留在那里,如果我了解您在该表中所做的事情。获得标准化表后,我只需使用这两个变量,并在proc tabulate 中仔细构造分母定义,以便为我的pctn 值提供正确的基础。它与之前的单个表不太一样——变量名在它自己的列中,而不是在值列表的顶部——但老实说,在我看来这看起来更好。
data class_norm;
set class;
length val $2;
varname='age';
val=put(age,2. -l);
if not missing(age) then output;
varname='sex';
val=sex;
if not missing(sex) then output;
keep varname val;
run;
proc tabulate data=class_norm;
class varname val;
tables varname=' '*val=' ',n pctn<val>;
run;
如果您想要比这更好的东西,您可能必须在proc report 中构建它。这为您提供了最大的灵活性,但也是最繁重的编程。