如何在Proc Means中重命名类变量的总计数

时间:2017-04-19 20:00:22

标签: sas grouping

我在类变量中对一个副变量的出现进行了简单计数,但找不到重命名类变量总数的方法。此时,输出数据集包括每个组内所有cluster2的计数以及所有组中的总计数(即使用的类变量)。但是,类中的计数被命名,而总数由空字符串显示。

代码:

proc means data=seeds noprint;
   class group;
   by cluster2;
   id label2;
   output out=seeds_counts (drop= _type_ _freq_) n(id)=count;
run;

输出文件示例:

cluster2   group    label2    count
7                   area 1    20
7          sa       area 1    15
7          sb       area 1    5
15                  area 15   42
15         sa       area 15   18
....

当然,将emtpy字符串重命名为" Total"可以在一个单独的datastep中完成,但我想直接在Proc Means-step中完成。这应该是简单而微不足道的,但到目前为止我还没有找到办法。之后,我想转置数据集,这意味着必须更改emtpy字符串,否则它将被删除在proc转置中。

3 个答案:

答案 0 :(得分:1)

我不知道直接做到这一点的方法,但是你可以作弊:你可以告诉SAS展示" Total"而不是失踪。

proc format;
  value $MissTotalF
  ' ' = 'Total'
  other = [$CHAR12.];
quit;

proc means data=sashelp.class noprint;
   class sex;
   id age;
   output out=sex_counts (drop= _type_ _freq_) n(age)=count;
  format sex $MissTotalF.;
run;

例如。我还建议您使用PROC TABULATE代替PROC MEANS,如果您只是为了计算,但在这种情况下,它并没有真正有太大作用。

答案 1 :(得分:1)

这里的问题是,如果class语句中的变量是数字,那么结果列将是数字,因此您不能添加单词Total(除非您使用格式,类似于答案来自@Joe)。这就是缺少值的原因,因为class变量可以是数字或字符。

以下是数字类变量的示例。

proc sort data=sashelp.class out=class;
by sex;
run;

proc means data=class noprint;
class age;
by sex;
output out=class_counts (drop= _:) n=count;
run;

使用proc tabulate几乎可以显示结果,但输出数据集将具有相同的缺失值,因此无法提供帮助。这里有几个例子。

proc tabulate data=class out=class_tabulate1 (drop=_:);
class sex age;
table sex*(age all='Total'),n='';
run;

proc tabulate data=class out=class_tabulate2 (drop=_:);
class sex age;
table sex,age*n='' all='Total';
run;

我认为实现最终目标的最佳选择是将nway选项添加到proc means,这将删除小计,然后转置数据并最终写入创建总计的数据步骤列每行汇总。这是3个步骤,但不涉及太多编码。

答案 2 :(得分:0)

以下是利用_TYPE_变量可以使用的一种方法,以便您可以单独处理总计和详细信息。如果有一个缺少值的类(与整体摘要记录分开),您仍然会遇到PROC TRANSPOSE问题。

proc means data=sashelp.class noprint;
   class sex;
   id age;
   output out=sex_counts (drop= _freq_ ) n(age)=count;
run;
proc transpose data=sex_counts out=transpose prefix=count_ ;
  where _type_=1 ;
  id sex ;
  var count;
run;
data transpose ;
 merge transpose sex_counts(where=(_type_=0) keep=_type_ count);
 rename count=count_Total;
 drop _type_;
run;