2012-01-26 33 views
1

我無法獲得proc報告來完成我想要的操作。使用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% 

正如你可以看到,它的狀態%總200%,這是荒謬號報告。我寧願不要總結國家的價值。我知道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%)。

的樣本數據:

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

你可以張貼一些樣本數據?使您的報告代碼更易於使用... –

+0

添加樣本數據 - 百分比可能不完全相加爲100,因爲我將它們四捨五入到小數點後4位。 – orh

回答

2

我使用一些邏輯,如果在你的電子計算機後會做的伎倆認爲。 試試這個(我略低更改的數據,讓我知道這並不代表你的數據):

(留在了=語句,它可以是有益的)

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; 
+0

謝謝!我想我會在rbreak的計算塊(也可能是每個狀態的計算機)中改變一下''pct_state.sum ='''。我曾嘗試過,只是pct_state ='';並沒有奏效 - 我錯過了「.sum」 – orh