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

「lag」を使用して「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 に答える