阅读一个和下一个观察(Read previous and next observations)

2019-07-17 19:01发布

我有这样一个数据集(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

任何方法提取先前的观测也? THX的任何帮助。

Answer 1:

尝试使用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;

有通过数据集中implicite循环,当你在使用它set语句。 _N_是包含关于什么的观察是在(开始从1)implicite环路信息的自动变量。 当你发现你的价值,你的价值存储_N_到可变current ,所以你知道哪一行,你发现它。 nobs是在数据集中观察的总数。

检查是否prev是大于0,如果next是小于nobs ,如果你的行是第一个数据集中的避免了错误(当时没有以前行),如果你的行是最后一个数据集(那么有没有下一行) 。



Answer 2:

/* generate test data */
data test;
    do dt = 1 to 100;
        sp = ifc( rand("uniform") > 0.75, "Y", "N" );
        output;
    end;
run;

proc sql;
    create table test2 as
        select  *,
            monotonic() as _n
        from  test
    ;
    create table test3 ( drop= _n ) as
        select  a.*
        from    test2 as a
        full join   test2 as b
            on  a._n = b._n + 1
        full join   test2 as c
            on a._n = c._n - 1
        where   a.sp = "Y"
            or b.sp = "Y"
            or c.sp = "Y"
    ;
quit;


文章来源: Read previous and next observations
标签: sas