2014-09-12 121 views
0

目前,我有一個文件(N實測值= 100,000),其中主要標識符是這樣的:子集SAS數據集選擇值從PROC頻率

ID Group 
1 a 
2 b 
3 a 
4 c 
5 b 
6 d 
7 d 

我想要做的就是創建該數據文件的一個子集。用proc freq我確定了前十名(最大號碼)Group。是否有子集數據,而不是硬基於編碼keep觀察一個更簡單的方法(其中numid =由group計數id):

proc freq data=have order=freq; 
    table group; 
    where numid > 7; 
run; 

謝謝!

+0

所以你想要一個數據集只包含來自前10個組的數據?你想要這十個組中的所有行,或者你想限制PROC FREQ輸出嗎? – Joe 2014-09-12 21:08:50

回答

1

如果您需要一個表格,其中包含屬於按頻率排列的前10位的組中的記錄,則可以非常輕鬆地完成此操作。在PROC FREQ後面使用PROC RANK並將其加入主表。 (您可以手動搶在PROC SQL前10名的行列,但這似乎速度更快,因爲PROC RANK是超級快,有各種各樣的,有助於打破關係和這樣的。期權)

data have; 
    call streaminit(7); 
    do id = 1 to 1000; 
    group = byte(ceil(rand('Uniform')*26)+64); 
    output; 
end; 
run; 

proc freq data=have; 
    tables group/out=group_counts; 
run; 

proc rank data=group_counts out=ranks descending; 
    var count; 
    ranks rank; 
run; 

proc sql; 
    create table want as 
    select H.* 
    from have H, ranks R 
    where H.group=R.group 
     and R.rank le 10; 
quit; 

100K,這應該是足夠快。如果你的數據範圍太大 - 太慢,你應該將RANK轉換爲格式,這樣你就不必進行連接了(下一次使用數據時就可以使用該格式進行子集化)。