1

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

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;

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

4

2 回答 2

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;
于 2013-08-27T12:30:57.973 回答
2

这不是您可以在 PROC MEANS 中轻松完成的事情。在 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;
于 2013-08-26T14:24:50.480 回答