我无法让proc报告完成我想做的事情。
我有一张表,其中包含州,项目,计数,州和百分比。有总结线给出按州和总计的总数。我的问题是这些摘要线总结了总计水平的州总数。像这样:
CODE:
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%,这是一个荒谬的数字。我宁愿让它根本不总结州的价值。我知道sas网站警告在使用汇总行的表格上使用日期,因为SAS将它们解释为数字变量并因此总结它们......但它没有提供一个好的解决方案。我真的不明白为什么BREAK
和RBREAK
语句没有允许你指定的“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%)。
示例数据:
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
;
答案 0 :(得分: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;