在SAS中使用proc意味着在组中找到最大值?

时间:2013-08-26 09:55:26

标签: sas

假设我的表格中有这样的数据

match_day name    Goals

1         Higuain   4 
1         Messi     1
1         Ozil      4
1         Villa     3
1         Xavi      4
2        Benzema    4
2        Messi      4
2        Ronaldo    3
2         Villa     4
2         Xavi      4

现在我想找出每场比赛中哪个球员得分最高。我尝试使用它 -

  proc means data=b nway max;
  class match_day name;
  var goals;
  output out=c(drop=_type_ _freq_) max=goals;
  run;

但这不起作用。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

这不是你在PROC手段中可以轻易做到的事情。在SQL或数据步骤中更容易做到。最直接的解决方案:

proc sort data=b;
by match_day descending goals; *so the highest goal number is at top;
run; 

data c;
set b;
by match_day;
if first.match_day; *the first record per match_day;
run;

这将为您提供目标数量最多的记录。如果存在平局,则不会获得多于一条记录,而是任意第一条记录。

如果你想保留所有带有该号码的记录,你可以这样做:

data c;
set b;
retain keep;
by match_day descending goals;
if first.match_day then keep=1; *the first record per match_day, flag to keep;
if keep=1 then output;          *output records to be kept;
if last.goals then keep=0;      *clear the keep flag at the end of the first goals set;
drop keep;
run;

答案 1 :(得分:2)

为了清除PROC MEANS语法,您可以使用以下代码显示每个match_day的最高目标得分者。

proc means data=b noprint nway;
class match_day;
output out=c(drop=_:) maxid(goals(name goals))=;
run;

但是,你得到了@Joe提出的问题,即每个match_day只返回一条记录,这在最佳射手有联系的情况下并不理想。

如果您想使用某个程序,PROC RANK可以为您执行此操作。

proc rank data=b out=c (where=(goals_rank=1)) ties=low descending;
by match_day;
var goals;
ranks goals_rank;
run;