首页 > 解决方案 > 为每个组只保留最高排名的观察的有效方法

问题描述

我只想为每个团队保留排名最高的行。如果有平局,我想要排名较高的那一行。然后是更高的等级3。

例如,

data test;
input name $ team $ rank1 rank2 rank3 country $
datalines;
Bob A 5 6 5 US   
Joe A 8 2 6 UK
Dav B 9 7 2 GER
Jim B 9 4 4 FRA
Bob C 3 4 1 FRA
Dan D 5 2 7 GER
Ike D 5 2 7 US
Jay D 5 2 8 UK
run;

我想:

Joe A 8 2 6 UK
Dav B 9 7 2 GER
Bob C 3 4 1 FRA
Jay D 5 2 8 UK

最有效的方法是什么?我正在使用的数据集非常大并且没有排序。我尝试了下面的代码,但排序需要永远运行。第二次排序对已经排序的数据进行排序。如果大多数团队只在数据集中出现一次怎么办?拆分为重复项和非重复项,仅对重复项进行排序然后追加是否更快?

proc sort data=test;
by team descending rank1 descending rank2 descending rank3;
run;

proc sort data=test nodupkey;
by team;
run;

标签: sas

解决方案


您可以使用 PROC Summary 来做到这一点。与您已经在做的相比,不确定性能。

proc summary data=test nway;
   class team;
   output out=ranked(drop=_:) idgroup(max(rank:) out(name rank: country)=);
   run;

在此处输入图像描述


推荐阅读