在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将非常简单。是的,我知道..但我不想使用它