目前我有一个文件(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;
谢谢!
答案 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转换为格式,这样您就不必进行连接(并且可以在下次使用该格式时进行子集化你使用数据。)