2017-06-06 113 views
0

假设数据集有两列SAS-如何具有一定的滞后计算观察

Date Time  Price 
01-03 11:00  1 
01-03 11:02  2 
01-03 11:02  3 
01-03 11:03  4 
01-03 11:07  5 
01-04 11:00  4 
01-04 11:01  6 
01-04 11:01  7 

我需要补充的是等于张贴的价格在同一天,最近分钟的新列。如果此分钟具有多个价格,则应选择第一个。例如

Date Time  Price New 
01-03 11:00  1  2 
01-03 11:02  2  4 
01-03 11:02  3  4 
01-03 11:03  4  5 
01-03 11:07  5  . 
01-04 11:00  4  6 
01-04 11:01  6  . 
01-04 11:01  7  . 

我使用的代码(by date; if first.time;)来解决多个日期的问题。由于时间之间的差距不是固定的,所以在这种情况下我不能使用滞后函数。所以我不知道如何选择最近一分钟的第一个价格。谁能给我一些解决方案? THX

+1

您是否拥有SAS ETS?你可以看看proc扩展到'向前看'。 – Reeza

回答

1

仅使用基础SAS,这并不是特别困难,但如果您拥有非常大的数据集,这不是最有效的方法,这应该在一般情况下表现良好。

我们遍历从下一行开始的数据集,直到找到具有不同时间或不同日期的行。如果时间不同,则将该价格保存为新价格,并且如果不同日期(或EOF)清除新价格变量。

data have; 
input Date :$5. Time :time5. Price; 
format time time5.; 
datalines; 
01-03 11:00  1 
01-03 11:02  2 
01-03 11:02  3 
01-03 11:03  4 
01-03 11:07  5 
01-04 11:00  4 
01-04 11:01  6 
01-04 11:01  7 
;;;; 
run; 

data want; 
    set have nobs=nobs; 
    do _i = _n_ to nobs until (new_date ne date or new_time > time); 
    set have(rename=(date=new_date price=new_price time=new_time)) point=_i; 
    end; 
    if (date ne new_date) or (_i > nobs) then call missing(new_price); *times that it searched beyond limits; 
run; 
+0

谢谢,这段代码看起来不错。如果我再问一个问题,你介意吗?如果我想要以固定的时间间隔获得新价格,比如观察后五分钟? – Neal801

+0

只需将它添加到until子句 - '直到new_time ge time + 300'或任何适当的。一旦您开始追踪当前行的数据集,这与其他解决方案相比,性能开始会变差。 – Joe