假设我的表格中有这样的数据
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;
但这不起作用。这样做的正确方法是什么?
答案 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;