2015-10-14 83 views
1

我怎么能生产出具有这种多个变量信息的表:SAS PROC频率 - 每个类别的频率为多个变量

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

你基本上有两种选择,它们在你遇到的问题种类上很相似:使用PROC TABULATE,这更自然地处理多个表格输出,或者使用已经调用的onewayfreqs输出对于。

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

尽管你可以做什么,特别是如果你能够使用格式化值(要么因为想要,要么因为它们是相同的!),将它们合并成一个结果。

例如,假设你从上面的数据集freq1

data freq1_out; 
    set freq1; 
    value = coalesce(of f_:); 
    keep table value frequency percent; 
run; 

,结合了F_变量为一个变量(如永远只有一个是不断填充)。如果你不能使用F_变量并且需要原始变量,那么你必须使用宏变量列表(或者其他一些方法,或者只是输入全部名称)来使用coalesce来创建自己的变量列表。

最后,你可以使用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; 

那当然可以平凡macrotized为类似

proc sql; 
    create table my_freqs as 
    %freq(table=sashelp.class,var=height) 
    union all 
    %freq(table=sashelp.class,var=weight) 
    union all 
    %freq(table=sashelp.class,var=age) 
    ; 
quit; 

甚至进一步要么与列表处理或宏循环。

+0

我的坏,乔,并不意味着要创建另一个“答案”。我将其删除并标记为最有用的答案。谢谢! – Mike