SAS Proc Freq - 多个变量的每个类别的频率

时间:2015-10-14 20:25:14

标签: sas

如何为多个变量生成具有此类信息的表:

VARIABLE    COUNT   PERCENT
U           51  94.4444
Y            3  5.5556

当我运行此程序时,这就是SAS在所有变量的列表输出中吐出的内容:

ods output nlevels=nlevels1 OneWayFreqs=freq1 ;

proc freq data=sample nlevels ;

   tables _character_ / out=outfreq1;

run;

outfreq1表中,只有数据集中的最后一个变量(上面显示的表)的信息,但不是所有变量的信息。 在nlevels1表中,有关于每个变量有多少类别但没有频率数据的信息。

我想要的是输出所有变量的频率信息。 没有宏/循环,有没有人知道这样做的方法?

1 个答案:

答案 0 :(得分:1)

你基本上有两个选项,它们在你遇到的问题类型上是相似的:使用PROC TABULATE,它更自然地处理多个表输出,或使用{{1您已经调用的输出。

这样做的问题是变量可能是不同类型的,因此它没有一列包含所有这些信息 - 每个变量都有一对列,这显然有点......凌乱。即使你的变量都是同一类型,SAS也不能认为这是一般规则,所以它不会为你产生一个很好的东西。

但是,您可以做什么,特别是如果您能够使用格式化的值(由于想要或由于它们相同!),将它们合并为一个结果。

例如,根据上面的onewayfreqs数据集:

freq1

将F_变量组合成一个变量(因为总是只填充一个变量)。如果您不能使用F_变量并且需要原始变量,则必须使用宏变量列表(或其他方法,或者只输入名称)来创建自己的变量列表以使用合并。

最后,您可以使用data freq1_out; set freq1; value = coalesce(of f_:); keep table value frequency percent; run; 来生成一个非常相似的表,尽管如果不使用宏语言我可能不会这样做。 PROC SQL是一个方便的工具;基本上,每个变量都有单独的子查询,变量UNION ALL,所以

group by

当然,这可以简单地宏观化到像

这样的东西
proc sql;
  create table my_freqs as
    select 'HEIGHT' as var, height, count(1) as count
    from sashelp.class
    group by 1,height
  union all
    select 'WEIGHT' as var, weight, count(1) as count
    from sashelp.class
    group by 1,weight
  union all
    select 'AGE' as var, age, count(1) as count
    from sashelp.class
    group by 1,age
  ;
quit;

甚至更进一步使用列表处理或宏循环。