2015-03-03 60 views
1

我知道如何通過proc freq或sql計數組和子組數。我的問題是什麼時候子組中的某個因素缺失,我仍然想要顯示缺失因子爲0.我該怎麼做?例如, 數據集:當某些子組因子爲0時,按行數和行數進行計數

group1 group2 
1  A 
1  A 
1  A 
1  A 
2  A 
2  B 
2  B 

我想要的結果:

group1 group2 N 
1  A  4 
1  B  0 
2  A  1 
2  B  2 

如果我只能使用默認的SAS設置,它通常會顯示爲

group1 group2 N 
1  A  4 
2  A  1 
2  B  2 

但我仍然希望結果中的第二行告訴我,該類別中有0個觀測值。

回答

3

Reeza的sparse選項,只要工作。假設有一個group1 3沒有在你的數據中表現出來,你仍然希望它們出現在頻率表中。如果是這種情況,解決方案是創建一個包含所有類別的參考表,然後將其加入頻率表中。

創建參考表:

data ref; 
    do group1 = 1 to 3; 
    group2 = 'A'; 
    output; 
    group2 = 'B'; 
    output; 
    end; 
run; 

創建PROC SQL的頻率表,右接合部的參考表:

proc sql; 
select 
    r.group1, 
    r.group2, 
    count(h.group1) as freq 
from 
    have h 
    right join ref r 
    on h.group1 = r.group1 
    and h.group2 = r.group2 
group by 
    r.group1, 
    r.group2 
order by 
    r.group1, 
    r.group2 
; 
quit; 
+0

當處理大型數據集時,我更喜歡基於proc的方法來完成總結,因爲他們避免做任何排序/索引。 – user667489 2015-03-03 18:53:12

6

在proc freq中使用SPARSE選項。考慮它是來自GROUP1和GROUP2的所有選項之間的交叉連接。因爲每個組是在數據中表示至少一次

data have; 
input group1 group2 $; 
cards; 
1 A 
1 A 
1 A 
1 A 
2 A 
2 B 
2 B 
; 
run; 

proc freq data=have; 
table group1*group2/out=want sparse; 
run; 

proc print data=want; 
run; 
+0

不錯,打我吧! – 2015-03-03 01:52:14

3

另一個選項是的,「如果有什麼DWal的問題之間的交叉數據不在數據中「和Reeza的One Proc,One Solution,是proc tabulate。如果格式包含所有可能的值,即使這些值沒有出現,也可以使用printmiss

proc format; 
value groupformat 
    1='Group 1' 
    2='Group 2' 
    3='Group 3' 
    ; 
quit; 

data have; 
input group1 group2 $; 
cards; 
1 A 
1 A 
1 A 
1 A 
2 A 
2 B 
2 B 
; 
run; 

proc tabulate data=have; 
    class group1 group2/preloadfmt; 
    format group1 groupformat.; 
    tables group1*group2,n/printmiss misstext='0'; 
run; 
1

如何通過PROC總結做到這一點,利用DWal的參考表來指定要使用的值組合:

data ref; 
    do group1 = 1 to 3; 
    group2 = 'A'; 
    output; 
    group2 = 'B'; 
    output; 
    end; 
run; 

data have; 
input group1 group2 $1.; 
cards; 
1 A 
1 A 
1 A 
1 A 
2 A 
2 B 
2 B 
; 
run; 

proc summary nway data = have classdata=ref; 
    class group1 group2; 
    output out = summary (drop = _TYPE_); 
run; 

注:我不得不稍微調整have數據集以確保group2在兩個數據集中的長度都是1。如果在classdata=data=數據集中使用具有相同名稱但長度不同的變量,SAS會發出抱怨。