2014-02-23 85 views
0

我有下面的示例數據:SAS數據步:計算基於前一行/下一行

data have; 
input username $ betdate : datetime. stake; 
dateOnly = datepart(betdate) ; 
format betdate DATETIME.; 
format dateOnly ddmmyy8.; 
datalines; 
player1 12NOV2008:12:04:01 90 
player1 04NOV2008:09:03:44 30 
player2 07NOV2008:14:03:33 120 
player1 05NOV2008:09:00:00 50 
player1 05NOV2008:09:05:00 30 
player1 05NOV2008:09:00:05 20 
player2 09NOV2008:10:05:10 10 
player2 15NOV2008:15:05:33 35 
player1 15NOV2008:15:05:33 35 
player1 15NOV2008:15:05:33 35 
run; 
proc print;run; 

proc sort data=have; by username dateonly betdate; run; 
data want; 
set have; 
by username dateonly betdate; 
if first.username then calendarTime = 0; 
if first.dateonly then calendarTime + 1; 
if first.username then eventTime = 0; 
if first.betdate then eventTime + 1; 
previousBetdateForPlayer = .; 
nextBetdateForPlayer = .; 
run; 
proc print;run; 

我如何填寫爲變量的previousBetdateForPlayer'和「nextBetdateForPlayer」的值。我知道如何去做PROC SQL,但是希望有一種更有效的方法來用DATA STEP來做到這一點。

這兩個變量都需要爲每個用戶名計算,所以'previousBetdateForPlayer'的值對於每個用戶名的首次下注都是NULL。 'nextBetdateForPlayer'的值對於每個用戶名的最終投注都是NULL。

回答

2
data want; 
    set have; 

    /*join right the same dataset shifted 1 row up*/ 
    if not eof then do; 
    set have(firstobs=2 
        keep=betdate 
        rename=(betdate=nextBetdateForPlayer)) end=eof; 

    end; 

    by username dateonly betdate; 
    if first.username then calendarTime = 0; 
    if first.dateonly then calendarTime + 1; 
    if first.username then eventTime = 0; 
    if first.betdate then eventTime + 1; 

    /*add previous and nullify it if first bet*/ 
    previousBetdateForPlayer = lag(previousBetdateForPlayer); 
    if first.username then previousBetdateForPlayer=.; 

    /*nullify next if last bet*/ 
    if last.username then nextBetdateForPlayer = .; 
run;