我有一些数据(使用代码创建),根据两个变量对观察进行排名。在这种情况下,它对玩家的第一次下注和第二次下注进行排名,并创建两个“排名”变量。我想要做的是根据两个变量的函数对观察结果进行排序(比如两个变量的平均值),我想在PROC RANK命令本身中执行此操作,而不是使用初步数据步骤作为在我需要的所有变量上复制之后,排名将得到相当的参与。我可以将运算符放入PROC RANK语句吗?而不是这样做:
Proc rank data=want ties=mean out=ranked groups=2;
var bet1stake bet2stake;
ranks bet1stakeRank bet2stakeRank;
run;
我想这样做:
Proc rank data=want ties=mean out=ranked groups=2;
var avg(bet1stake, bet2stake);
ranks firstTwoBetsRank;
run;
这可能吗?
这就是如何创建完整的示例数据。
data have;
input username $ betdate : datetime. stake winnings;
dateOnly = datepart(betdate) ;
format betdate DATETIME.;
format dateOnly ddmmyy8.;
datalines;
player1 12NOV2008:12:04:01 90 -90
player1 04NOV2008:09:03:44 100 40
player2 07NOV2008:14:03:33 120 -120
player1 05NOV2008:09:00:00 50 15
player1 05NOV2008:09:05:00 30 5
player1 05NOV2008:09:00:05 20 10
player2 09NOV2008:10:05:10 10 -10
player2 15NOV2008:15:05:33 35 -35
player1 15NOV2008:15:05:33 35 15
player1 15NOV2008:15:05:33 35 15
run;
proc sort data=have;
by username betdate;
run;
data have;
set have;
by username betdate;
retain eventTime;
if first.username then eventTime = 0;
if first.betdate then eventTime + 1;
run;
proc sql;
create table want as
select
distinct username,
(select distinct stake from have where username = main.username and eventTime = 1) as bet1Stake,
(select distinct stake from have where username = main.username and eventTime = 2) as bet2Stake
from have main;
quit;
Proc rank data=want ties=mean out=want groups=2;
var bet1stake bet2stake;
ranks bet1stakeRank bet2stakeRank;
run;
感谢您提供任何帮助。
答案 0 :(得分:2)
我担心你不能对你想要对你的观察进行排名的变量应用算子。
您的选择是使用DATA
步骤来同时执行运算符和计算排名
或者
如果您担心磁盘空间,请使用Data step view
或SQL view
将操作符作为中间步骤使用。
如果你从SQL数据库中提取数据(假设它支持窗口函数),那么你应该完全按照一些传递给数据库的SQL代码来做。