您基本上有两个选项,它们在您遇到的问题类型上有点相似:使用PROC TABULATE,它更自然地处理多表输出,或者使用onewayfreqs 输出你已经要求了。
这样做的问题是变量可能是不同的类型,所以它没有一个包含所有信息的列 - 每个变量都有一对列,这显然有点……混乱.即使您的变量都是相同的类型,SAS 也不能将其假定为一般规则,因此它不会为您生成一个漂亮的整洁的东西。
不过,您可以做的是将它们合并为一个结果,特别是如果您能够使用格式化的值(无论是因为想要,还是因为它们是相同的!)。
例如,给定上面的 freq1 数据集:
data freq1_out;
set freq1;
value = coalesce(of f_:);
keep table value frequency percent;
run;
这将 F_ 变量组合成一个变量(始终只填充一个)。如果您不能使用 F_ 变量并且需要原始变量,则必须使用宏变量列表(或其他方法,或者直接输入名称)创建自己的变量列表才能使用合并。
最后,您可能会使用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;
这当然可以简单地宏化为类似
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;
甚至可以进一步使用列表处理或宏循环。