多个变量的PROC FREQ组合成一个表

时间:2017-03-28 14:36:59

标签: sas

我有以下问题。我需要在多个变量上运行PROC FREQ,但我希望输出都在同一个表上。目前,PROC FREQ声明类似于TABLES ERstatus Age Race,InsuranceStatus;将计算每个变量的频率,并将它们全部打印在不同的表格上。我只想要一张桌子上的数据。

任何帮助将不胜感激。谢谢!

P.S。我尝试使用PROC TABULATE,但它没有正确计算N,所以我不确定我做错了什么。这是我的PROC TABULATE代码。我的变量都是绝对的,所以我只需要知道N和百分比。

PROC TABULATE DATA = BCanalysis;
CLASS ERstatus PRstatus Race TumorStage InsuranceStatus;
TABLE (ERstatus PRstatus Race TumorStage) * (N COLPCTN), InsuranceStatus;
RUN;

上述代码没有返回基于InsuranceStatus的正确频率,其中0 =保险,1 =未保险,但PROC FREQ确实如此。也不能用ROWPCTN正确计算。因此,我可以通过任何方式获得PROC FREQ来计算一个表上的多个变量,或者PROC TABULATE来返回正确的频率。

在仅对ERstatus和InsuranceStatus进行简化分析时,这是一个很好的输出图像。您可以看到PROC FREQ返回204个人,其ERstatus为1,InsuranceStatus为1.这是正确的。 PROC TABULATE中的值不是。 OUTPUT

2 个答案:

答案 0 :(得分:0)

您可以使用ODS OUTPUT将所有PROC FREQ输出转换为一个数据集。

ods output onewayfreqs=class_freqs;
proc freq data=sashelp.class;
  tables age sex;
run;
ods output close;

ods output crosstabfreqs=class_tabs;
proc freq data=sashelp.class;
  tables sex*(height weight);
run;
ods output close;

Crosstabfreqs是交叉表输出的名称,而单向频率是onewayfreqs。如果您忘记了名字,可以使用ods trace找到该名称。

你可能(可能会)仍然需要操纵这个数据集,以获得你想要的结构。

答案 1 :(得分:0)

我将单独回答这个问题,因为这是对问题的另一种可能的解释;如果澄清了,我会删除其中一个。

如果您想在单个打印的表格中使用此功能,则需要使用proc tabulate或者需要规范化数据 - 这意味着将其设置为{{1} }。 variable | value无法在单个表格中执行多个单向频率。

对于PROC FREQ,您的问题很可能是缺少数据。将检查PROC TABULATE语句中的任何变量是否缺失,如果任何行缺少任何类变量的数据,那么这些行将完全从所有变量的列表中排除

您可以通过在class语句或表语句或missing语句中添加class选项来覆盖此选项。所以:

proc tabulate

这会导致外观与您的桌面略有不同,因为它会包含您可能想要它们的地方缺少的行,并且它们将被考虑在内PROC TABULATE DATA = BCanalysis; CLASS ERstatus PRstatus Race TumorStage InsuranceStatus/missing; TABLE (ERstatus PRstatus Race TumorStage) * (N COLPCTN), InsuranceStatus; RUN; 再次你可能不想要它们。

通常需要进行一些操作;最简单的方法是规范化您的数据,然后运行制表(使用colpctnPROC 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;

然后我们得到两个子表的总共N = 17 - 这不是我们想要的,我们想要N = 18。然后我们可以做到:

proc tabulate data=class;
  class age sex;
  tables (age sex),(N colpctn);
run;

但那也不是很正确;我希望F有8/18 = 44.44%和M 10/18 = 55.55%,而不是42%和53%,5%分配给缺失的行。

我这样做的方法是规范化数据。这意味着您将获得包含2个变量proc tabulate data=class; class age sex/missing; tables (age sex),(N colpctn); run; varname的数据集,或者对数据有意义的数据集,以及您可能拥有的任何标识符/人口统计/什么变量。除非您的所有值都是数字,否则val必须是字符。

例如,我在此处使用valclass变量对age进行规范化。我没有保留任何标识符,但您确实可以在您的数据中,如果我了解您在该表中执行的操作,我认为sex会保留在那里。一旦我有了规范化的表,我只使用这两个变量,并在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; 中构建它。这为您提供了最大的灵活性,但也是最繁重的程序。