如何为多个变量生成具有此类信息的表:
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
表中,有关于每个变量有多少类别但没有频率数据的信息。
我想要的是输出所有变量的频率信息。 没有宏/循环,有没有人知道这样做的方法?
答案 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;
甚至更进一步使用列表处理或宏循环。