首页 文章

与PROC REPORT和汇总线搏斗

提问于
浏览
1

我无法让proc报告完成我想做的事情 .

我有一张表,其中包含州,项目,计数,州和百分比 . 有总结线给出按州和总计的总数 . 我的问题是这些摘要线总结了总计水平的州总数 . 像这样:

码:

proc report data=dataset nowd ;
columns state item count pct_state percent;

define state /order 'State';
define item / 'Status';
define count / '#';
define pct_state / '% of State';
define percent / '% of Total';

break after state/ol summarize;
compute after state;
  item=catt(state,' Total');
  state = '';
  line @1 ' ';
endcomp;
rbreak after /ol summarize;
compute after;
  involved = 'Grand Total';
endcomp;
run;

做一个像这样的表:

State  Item   #  %state  %total
AL      A     2   40.0%   20.0%
        B     3   60.0%   30.0%
     AL Total 5  100.0%   50.0%

MN      A     1   20.0%   10.0%
        B     1   20.0%   10.0%
        C     3   60.0%   30.0%
     MN Total 5  100.0%   50.0%

Grand Total   10 200.0%  100.0%

如您所见,它将状态%total报告为200%,这是一个荒谬的数字 . 我宁愿让它根本不总结州的 Value . 我知道sas网站警告在使用汇总行的表格上使用日期,因为SAS将它们解释为数字变量并因此对它们进行总结......但它并不理解 BREAKRBREAK 语句为什么没有"VAR"选项让你指定......但现在我需要一个解决方法 .

我想出的是创建一个新变量并将百分比存储为文本,以便它不能在摘要中计算,但这是一个非常倒退的方法 .

data dataset; set dataset;
  state_txt = trim(left(put(pct_state,percent10.1)));
run;

proc report data=dataset nowd ;
columns state item count state_txt percent;

define state /order 'State';
define item / 'Status';
define count / '#';
define state_txt / right '% of State';
define percent / '% of Total';

break after state/ol summarize;
compute after state;
  item=catt(state,' Total');
  state = '';
  line @1 ' ';
endcomp;
rbreak after /ol summarize;
compute after;
  involved = 'Grand Total';
endcomp;
run;

这消除了所有的摘要(因为它是一个字符变量),但是当我应该能够说出类似于 rbreak after /summarize var=count percent; 之类的内容时,它似乎只是一种可怕的做事方式 . 有没有更好的方法呢?另外,我不介意它是否将每州的水平概括为100%......虽然它不是优先考虑的重点,但远不如说它在底部不是200%(或者在完整的情况下)美国表,5000%) .

Sample data:

data dataset;
 length state item $50;
 infile datalines delimiter=','; 
 input state item $ count percent pct_state;
 datalines;  
  AL,A,8,0.0047,1.0000
  DC,A,1,0.0006,0.5000
  DC,B,1,0.0006,0.5000
  FL,A,18,0.0107,0.7500
  FL,B,2,0.0012,0.0833
  FL,C,4,0.0024,0.1667
  LA,A,434,0.2576,0.8314
  LA,B,69,0.0409,0.1322
  LA,C,19,0.0113,0.0364
  MI,A,1,0.0006,1.0000
  MS,A,4,0.0024,0.8000
  MS,B,1,0.0006,0.2000
  OK,A,2,0.0012,1.0000
  PA,A,1,0.0006,1.0000
  TX,A,943,0.5596,0.8435
  TX,B,132,0.0783,0.1181
  TX,C,43,0.0255,0.0385
  VA,A,1,0.0006,1.0000
  WI,B,1,0.0006,1.0000
  ;

1 回答

  • 2

    我认为使用一些如果你的COMPUTE AFTER中的逻辑可以解决问题 . 试试这个(我稍微更改了数据,如果这不代表您的数据,请告诉我):

    (留在out =语句中,这可能会有所帮助)

    data dataset;
     length state item $50;
     infile datalines delimiter=','; 
     input state item $ count percent pct_state;
     format percent pct_state percent10.1;
     datalines;  
      AL,A,8,0.8,1.0000
      DC,A,1,0.1,0.5000
      DC,B,1,0.1,0.5000
     ;
    
    proc report data=dataset nowd out=work.report;
     columns state item count pct_state percent;
    
      define state /order 'State';
      define item / 'Status';
      define count / '#';
      define pct_state / '% of State';
      define percent / '% of Total';
    
      break after state/ol summarize;
      compute after state;
       item=catt(state,' Total');
       state = '';
       line @1 ' ';
      endcomp;
    
      rbreak after /ol summarize;
      compute after;
       State = 'Grand Total';
       if pct_state.sum>1 then pct_state.sum=1;
      endcomp;
    
     run;
    

相关问题