2014-09-12 92 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转换为格式,这样你就不必进行连接了(下一次使用数据时就可以使用该格式进行子集化)。