Эффективный способ сохранить только самые высокие оценки для каждой группы - PullRequest
0 голосов
/ 29 августа 2018

Я хочу сохранить только строку с самым высоким рангом1 для каждой команды. Если есть связь, я хочу строку с более высоким рангом2. И тогда более высокий ранг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;

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете сделать это с помощью PROC SUMMARY. Не уверен в производительности по сравнению с тем, что вы уже делаете.

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

enter image description here

...