阅读上一次和下一次观察

时间:2013-01-03 06:01:55

标签: sas

我有一个像这样的数据集(sp是一个指标):

datetime        sp
ddmmyy:10:30:00 N
ddmmyy:10:31:00 N
ddmmyy:10:32:00 Y
ddmmyy:10:33:00 N
ddmmyy:10:34:00 N

我想用" Y"提取观察结果。以及前一个和下一个:

ID              sp
ddmmyy:10:31:00 N
ddmmyy:10:32:00 Y
ddmmyy:10:33:00 N

我厌倦了使用"滞后"并成功地用" Y"提取观察结果。和下一个,但仍然不知道如何提取前一个。

这是我的尝试:

data surprise_6_step3; set surprise_6_step2;
length lag_sp $1;
lag_sp=lag(sp);
if sp='N' and lag(sp)='N' then delete;
run;

结果是:

ID              sp
ddmmyy:10:32:00 Y
ddmmyy:10:33:00 N

提取先前观察的任何方法也? 感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

尝试在数据步骤中使用point语句中的set选项。 像这样:

data extract;
set surprise_6_step2 nobs=nobs;
if sp = 'Y' then do;
  current = _N_;
  prev = current - 1;
  next = current + 1;

  if prev > 0 then do;
    set x point = prev;
    output;
  end;

  set x point = current;
  output;

  if next <= nobs then do;
    set x point = next;
    output;
  end;
end;

run;

set语句中使用数据集时,有一个隐含的循环数据集。 _N_是一个自动变量,包含有关哪些观察是隐含循环的信息(从1开始)。当您找到值时,将_N_的值存储到变量current中,以便知道您在哪一行找到它。 nobs是数据集中的观察总数。

检查prev是否大于0,如果next小于nobs,如果您的行在数据集中的第一行(那么没有前一行),则{{1}}可以避免错误你的行在数据集中是最后一行(然后没有下一行)。