子集SAS数据集,其中包含来自proc freq的选择值

时间:2014-09-12 20:50:31

标签: sql sas

目前我有一个文件(n obs = 100,000),主要标识符如下:

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

我想要做的是创建此数据文件的子集。使用proc freq我已确定前十名(最大尺寸)Group。是否有更简单的方法来对数据进行子集化,而不是基于keep = numid计算id的{​​{1}}来对group观察值进行硬编码:

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

谢谢!

1 个答案:

答案 0 :(得分: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转换为格式,这样您就不必进行连接(并且可以在下次使用该格式时进行子集化你使用数据。)