1

我有一些样本数据如下,想计算连续输赢的次数。

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 PRINT; RUN;
proc sort data=have;
   by username betdate;
run;
DM "log; clear;";
data want;
   set have;
    by username dateOnly betdate;   
   retain calendarTime eventTime cumulativeDailyProfit profitableFlag;
   if first.username then calendarTime = 0;
   if first.dateOnly then calendarTime + 1;
   if first.username then eventTime = 0;
   if first.betdate then eventTime + 1;
   if first.username then cumulativeDailyProfit = 0;
   if first.dateOnly then cumulativeDailyProfit = 0;
   if first.betdate then cumulativeDailyProfit + stake;
   if winnings > 0 then winner = 1;
  if winnings <= 0 then winner = 0;
 PROC PRINT; RUN;

例如,前四次下注四位玩家 1 为赢家,因此该列的前四行应显示 1,2,3,4(此时为四连胜)。第五个是失败者,所以应该显示-1,然后是1,2。以下三行(对于玩家 3,应该显示 -1、-2、-3,因为客户已经连续下注了 3 次。如何在数据步骤中计算该列的值?我怎么也有一个一行中最大的获胜赌注数量(迄今为止)和客户迄今为止在每一行中必须输掉的最大赌注数量的列?

谢谢你的帮助。

4

1 回答 1

3

要进行这样的运行总计,您可以使用BYNOTSORTED仍然利用该first.<var>功能。例如:

data have;
input winlose $;
datalines;
win
win
win
win
lose
lose
win
lose
win
win
lose
;;;;
run;

data want;
set have;
by winlose notsorted;
if first.winlose and winlose='win' then counter=1;
else if first.winlose then counter=-1;
else if winlose='win' then counter+1;
else counter+(-1);
run;

每次“赢”变为“输”或相反时,它都会将first.winlose变量重置为 1。

完成此操作后,您可以使用双 DoW 循环来附加最大值,或者更容易在数据集中获取此值,然后通过第二个数据步(或 proc sql)将其添加以附加所需的变量。

于 2013-07-29T17:55:24.143 回答