Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS Proc Freq-多个变量的每个类别的频率_Sas - Fatal编程技术网

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

SAS Proc Freq-多个变量的每个类别的频率,sas,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

如何生成包含多个变量的此类信息的表:

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;
outrequ1
表中,只有数据集中最后一个变量的信息(如上表所示),但不是所有变量的信息。 在
nlevels1
表中,有关于每个变量有多少类别的信息,但没有频率数据

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

您基本上有两个选项,这两个选项在您遇到的问题类型上有点类似:使用
PROC tablate
,它更自然地处理多个表输出,或者使用您已经调用的
onewayfreqs
输出

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

但是,您可以做的是将它们合并成一个结果,特别是如果您能够使用格式化的值(或者是因为希望,或者是因为它们是相同的!)

例如,给定上面的
freq1
数据集:

data freq1_out;
  set freq1;
  value = coalesce(of f_:);
  keep table value frequency percent;
run;
将F_u变量组合成一个变量(始终只填充一个变量)。如果您不能使用F_u变量,并且需要原始变量,那么您必须使用宏变量列表(或其他方法,或者只是键入所有名称)来使用coalesce

最后,您可能可以使用
procsql
生成一个非常类似的表,尽管如果不使用宏语言,我可能不会这样做
UNION-ALL
在这里是一个方便的工具;基本上,每个变量都有单独的子查询,每个子查询都有一个
groupby
变量,所以

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;

或者更进一步,通过列表处理或宏循环。

我的坏,Joe,并不是要创建另一个“答案”。我删除了它,并将您的答案标记为最有用。非常感谢。