В SAS как печатать ведущие и запаздывающие наблюдения - PullRequest
0 голосов
/ 02 декабря 2018

Я ищу способ напечатать текущее, ведущее и запаздывающее наблюдение согласно переменной флага.Если наблюдение помечено, я хочу напечатать это наблюдение, а также его отстающий и передний ряд.

Имеют:

    ID        VAR1        VAR2        Flag
    --------------------------------------      
    ID1        1           15           .
    ID1        2           14           1
    ID1        3           13           .
    ID1        4           12           .
    ID2        5           11           .
    ID2        6           10           .
    ID2        7            9           1
    ID2        8            8           .   
    ID2        9            7           . 
    ID3        10           6           .
    ID3        11           5           1
    ID3        12           4           .
    ID3        13           3           .
    ID3        14           2           1
    ID3        15           1           .

Хочу:

    ID        VAR1        VAR2        Flag
    --------------------------------------      
    ID1        1           15           .
    ID1        2           14           1
    ID1        3           13           .
    ID2        6           10           .
    ID2        7            9           1
    ID2        8            8           .  
    ID3        10           6           .
    ID3        11           5           1
    ID3        12           4           .
    ID3        13           3           .
    ID3        14           2           1
    ID3        15           1           .

Я пробовал функции Proc Expand, но поскольку эта процедура не может справиться с отсутствующими значениями, она неуместно в моем рабочем случае.

Другой подход состоит в том, чтобы упорядочить набор данных в желаемом порядке, а затем создать переменную, нумерацию каждой строки по порядку - печать текущей строки + 1, -1 при условии флага.

IsЕсть ли более прямой способ получить набор данных, состоящий из текущих, отстающих и ведущих строк в соответствии с флагом?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Найти предыдущее значение FLAG легко с помощью функции LAG ().Найти следующее значение немного сложнее.Вот метод.

data want ;
  set have end=eof;
  by id ;
  if not eof then set have(keep=flag rename=(flag=lead_flag) firstobs=2);
  lag_flag=lag(flag);
  if first.id then call missing(lag_flag);
  if last.id then call missing(lead_flag);
  if flag or lead_flag or lag_flag ;
run;
0 голосов
/ 03 декабря 2018

Более общий сценарий будет выглядеть следующим образом:

  • В каждом отчете группы каждая строка соответствует фулкраловому условию, а также p строк до и q строк после

p и q будут соответствовать понятиям размер лага и размер свинца .Хеш-объект может отслеживать порядковый номер внутри группы для строк, которые должны быть выведены.Техника двойного DOW используется для измерения по группе (вычисление номера seq для вывода), а затем для оценки меры для каждого элемента в группе.

Например:

data have;
  do id = 'A', 'B', 'C', 'D';
    do seq = 1 to 36;
       rowid + 1;

       x = seq;
       if id = 'D' then x = floor(12*ranuni(123));

       flag = mod(x,7);
       output;
    end;
  end;
run;


%let lagsize = 2;
%let leadsize = 3;

data want;
  if _n_ = 1 then do;
    declare hash marks();
    retain __n .;
    marks.defineKey('__n');
    marks.defineData('__n');
    marks.defineDone();
  end;

  marks.clear();
  do __n = 1 by 1 until(last.id);
    set have;
    by id;
    if 
      flag=0 /* fulcrum criteria checked for each row in group */
    then do;
      * computation is "store sequence number that would fall in the lag lead 'about' space";
      _n_ = __n;
      do __n = _n_ - &lagsize to _n_ + &leadsize;
        marks.replace();
      end;
      __n = _n_;
    end;
  end;

  do __n = 1 to __n;
    set have;
    if marks.check()=0 then output; * evaluate for each row in group;
  end;
run;

Техника может быть расширена до случая, когда требуются разные размеры «около», основанные на различных условиях фулкрала.

0 голосов
/ 02 декабря 2018

вы можете использовать var1 + 1 и var-1 для flag =.как показано ниже.

     proc sql;
create table want as 
select distinct a.* from 
(select * from have)a
inner join 
(select * from have
where flag = 1 )b
on a.var1 = b.var1
or a.var1 = b.var1-1
or a.var1 = b.var1 +1;
...