Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.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 Means中重命名类变量的总计数_Sas_Grouping - Fatal编程技术网

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

Sas 如何在Proc Means中重命名类变量的总计数,sas,grouping,Sas,Grouping,我正在对类变量中by变量的出现次数进行简单计数,但找不到一种方法来重命名跨类变量的总计数。目前,输出数据集包括每个组内所有cluster2的计数以及所有组的总计数(即使用的类变量)。但是,类中的计数是命名的,而总数是用空字符串显示的 代码: proc means data=seeds noprint; class group; by cluster2; id label2; output out=seeds_counts (drop= _type_ _freq_) n(i

我正在对类变量中by变量的出现次数进行简单计数,但找不到一种方法来重命名跨类变量的总计数。目前,输出数据集包括每个组内所有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步骤中完成。它应该是简单和琐碎的,但我还没有找到一种方法。之后,我想转置数据集,这意味着必须更改emtpy字符串,否则它将在proc transpose中被删除。

我不知道直接进行转置的方法,但您可以进行某种欺骗:您可以告诉SAS显示“Total”而不是missing

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 tablate
而不是
PROC MEANS
,尽管在这种情况下,这并没有多大区别。

这里的问题是,如果
语句中的变量是数字,则结果列将是数字,因此,您不能添加单词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 tablate
可以按照您想要的方式显示结果,但是输出数据集将具有相同的缺失值,因此没有真正的帮助。这里有几个例子

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
,这将删除小计,然后转置数据,最后编写一个数据步骤,通过对每行求和来创建总计列。这是三个步骤,但不涉及太多的编码。

这里有一种方法,您可以利用_TYPE_u变量来使用,这样您就可以分别处理总计和明细。如果有一个类缺少值(与总体摘要记录分开),那么PROC TRANSPOSE仍然会有问题


如果要将总计作为汇总表,请改用PROC TABLATE,而不是PROC MEANS。@Reeza我希望将总计以及同一表中各个组的计数都转换为以后的转置(获得与数据透视excel表相同的排序结果)。这可以使用Proc TABLATE完成吗?我不太熟悉这个过程。这正是PROC TABLATE设计的目的。我想推荐一篇论文,但找不到好的。不过,这里有很多,听起来像是需要报告,所以请使用列表或报告之类的报告过程。或者只是使用数据步骤编写所需的报告。因此,没有单独的步骤就无法处理此问题?为这样一件小事单独增加一个步骤似乎太笨拙了。使用Proc TABLATE可以更好地标记组和总数吗?请查看STACKODS选项,而不是转置。+仅针对我不知道的“drop=\”通配符。
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;