5

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

还有什么方法可以提取先前的观察结果吗?感谢您的帮助。

4

2 回答 2

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

于 2013-01-03T07:01:35.317 回答
0
/* 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;
于 2013-01-03T22:14:42.753 回答