在SAS中构建包含子摘要行的表

在SAS中构建包含子摘要行的表,sas,Sas,假设我有两组客户机,每个客户机都有一个值,即客户机对我的价值。现在,我想创建一个汇总表,其中的行对该集群的所有客户机值进行子汇总 示例输入表客户端: client cluster value 1 1 3 2 2 1 3 1 4 4 1 1 5 2 5 所需的预期输出: cluster client value comment 1 1

假设我有两组客户机,每个客户机都有一个值,即客户机对我的价值。现在,我想创建一个汇总表,其中的行对该集群的所有客户机值进行子汇总

示例输入表
客户端

client  cluster  value
1       1        3
2       2        1
3       1        4
4       1        1
5       2        5 
所需的预期输出<代码>

cluster  client   value    comment
1        1        3        kEuro
1        3        4        kEuro
1        4        1        kEuro
1        .        8        sum for cluster 1
2        2        1        kEuro
2        5        5        kEuro
2        .        6        sum for cluster 2
我现在正在寻找实现这一目标的最有效方法。到目前为止,我想到的是下面的代码,它并不能完全解决这个问题:我只看到了
sumf
,而不是
sumforclusterx

proc sql;
  create table part_1 as
  select cluster, client, value
       , "kEuro" as comment
  from clients
  where cluster = 1;
quit;

proc sql;
  create table part_2 as
  select cluster, client, value
       , "kEuro" as comment
  from clients
  where cluster = 2;
quit;

/* The summation over the clusters */
proc means noprint data=part1;
  output out=psum_1 (drop=_type_ _freq_) sum=;
run;

proc means noprint data=part2;
  output out=psum_2 (drop=_type_ _freq_) sum=;
run;

/* The concatenation stage 1 */
data puzzle_1;
  set part_1 psum_1 (in=in2);
  if in2 then do;
    client = .;
    comment = 'sum for cluster 1';
  end;
run;

data puzzle_2;
  set part_2 psum_2 (in=in2);
  if in2 then do;
    client = .;
    comment = 'sum for cluster 2';
  end;
run;

/* The concatenation stage 2 */
data wanted;
  set puzzle_1 puzzle_2;
run;

如果我有两个以上的集群,是否有更好的方法来解决这个问题,最好是我可以循环使用的方法?

通常您会而不是将摘要行添加到包含要聚合的详细信息的数据集中。而是考虑使用一个报告工具,如<代码> PROC报告,<代码> PROC表或<代码> PROC摘要< /C> < /P> 例如:

使用过程报告显示详细信息和摘要行

data have; input 
client  cluster  value; datalines;
1       1        3
2       2        1
3       1        4
4       1        1
5       2        5 
;

ods html file='report.html';

proc report data=have;
  columns cluster client value;
  define cluster / order;
  define client / display;
  define value / sum;
  break after cluster / summarize style=[fontstyle=italic background=lightgray]; 

run;

ods html close;

如果您确实觉得有必要使原始数据更难在下游使用:

  • 类簇
    语句添加到您的
    Proc MEANS
  • 群集对原始数据进行排序
  • 使用
    SET original MEANS\u output将原始数据与均值输出叠加;聚类分析

您可以使用PROC MEANS/SUMMARY生成摘要行。然后使用一个带有BY的集合将摘要行添加到详细信息行

data have;
 input client cluster value ;
cards;
1 1 3
2 2 1
3 1 4
4 1 1
5 2 5
;

proc sort data=have; by cluster client; run;
proc means data=have noprint nway ;
  by cluster;
  var value;
  output out=sum sum= ;
run;

data want;
  set have sum ;
  by cluster;
  length comment $20 ;
  if last.cluster then comment=catx(' ','sum for cluster',cluster);
  else comment='kEuro';
run;

proc print ;
  var cluster client value comment;
run;

谢谢你的解释。使原始数据更难在下游使用的需要实际上是交织数据流体系结构的一部分。换句话说,输出表的结构由项目给出。