SAS-如何计算具有一定滞后的观测值

时间:2017-06-06 19:08:28

标签: sas lag

假设数据集有两列

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 个答案:

答案 0 :(得分: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;