在SAS中使用proc方法查找组中的最大值?

在SAS中使用proc方法查找组中的最大值?,sas,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 Xav

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

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;

但这是行不通的。正确的方法是什么?

在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;

在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;

为了澄清PROC-MEANS语法,您可以使用下面的代码来显示每场比赛的最高得分者

proc means data=b noprint nway;
class match_day;
output out=c(drop=_:) maxid(goals(name goals))=;
run;
然而,@Joe提出的问题是,每场比赛只会返回一条记录,这在顶级射手平局的情况下并不理想

如果您想使用一个过程,那么PROC-RANK可以为您这样做

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

为了澄清PROC-MEANS语法,您可以使用下面的代码来显示每场比赛的最高得分者

proc means data=b noprint nway;
class match_day;
output out=c(drop=_:) maxid(goals(name goals))=;
run;
然而,@Joe提出的问题是,每场比赛只会返回一条记录,这在顶级射手平局的情况下并不理想

如果您想使用一个过程,那么PROC-RANK可以为您这样做

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

因为第二列是Player,不是name…哦,不..它只是name..我的坏…编辑日志告诉你什么和/或你得到了什么输出,如果有的话?如果你愿意的话,使用proc sql将非常简单。是的,我知道..但我不想使用它,因为第二列是Player,不是名字…哦,不..只是名字..我的坏…编辑日志告诉你什么和/或你得到了什么输出,如果有的话?如果你愿意的话,使用proc sql将非常简单。是的,我知道..但我不想使用它