我有以下问题。我需要在多个变量上运行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
答案 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;
再次你可能不想要它们。
通常需要进行一些操作;最简单的方法是规范化您的数据,然后运行制表(使用colpctn
或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;
然后我们得到两个子表的总共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
必须是字符。
例如,我在此处使用val
和class
变量对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;
中构建它。这为您提供了最大的灵活性,但也是最繁重的程序。