SAS: извлечь предыдущие и последующие наблюдения - PullRequest
0 голосов
/ 03 мая 2018

У меня есть такой набор данных (тип является индикатором):

 datetime         type
 ...
 ddmmyy:10:30:00  0
 ddmmyy:10:31:00  0
 ddmmyy:10:32:00  1
 ddmmyy:10:33:00  0
 ddmmyy:10:34:00  1
 ddmmyy:10:35:00  0
 ...

Я пытался извлечь данные с типом 1, а также предыдущий и следующий. Просто попробуйте извлечь (-1, + 1) окно на основе типа 1.

datetime         type
...
ddmmyy:10:31:00  0
ddmmyy:10:32:00  1
ddmmyy:10:33:00  0
ddmmyy:10:34:00  1
ddmmyy:10:35:00  0
...

Я нашел похожий пост здесь . Я скопировал и вставил код, но я не совсем уверен, что означает «х» в его коде. SAS дает мне «Файл WORK.x не существует».

Может кто-нибудь мне помочь? Спасибо.

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Переместите следующее наблюдение вверх и сравните два наблюдения в одном ряду или используйте лаг для сравнения текущего наблюдения и предыдущего наблюдения.

data have;
length datetime $23.;
input datetime $ type ;
datalines;
ddmmyy:10:30:00  0
ddmmyy:10:31:00  0
ddmmyy:10:32:00  1
ddmmyy:10:33:00  0
ddmmyy:10:34:00  1
ddmmyy:10:35:00  0
;
run; 

data want;
    merge have have(firstobs=2 keep=type rename=(type=_type));
    if max(type,_type) or max(type,lag(type)) ;
    drop _type;
run;
0 голосов
/ 03 мая 2018

Для вашего примера данных, которые не имеют идентификатора или групповой переменной, все должно быть довольно просто. Вместо того, чтобы думать о перемещении вперед и назад в файле, просто создайте новые переменные, которые содержат предыдущее (LAG_TYPE) и следующее (LEAD_TYPE) значение для TYPE. Затем ваше требование сохранить наблюдения до того, как наблюдения с TYPE = 1 переведены на хранение наблюдений, где LEAD_TYPE = 1.

Давайте преобразуем ваши образцы данных в набор данных.

data have ;
  input datetime :$15. type ;
cards;
ddmmyy:10:30:00  0
ddmmyy:10:31:00  0
ddmmyy:10:32:00  1
ddmmyy:10:33:00  0
ddmmyy:10:34:00  1
ddmmyy:10:35:00  0
;

Вместо того, чтобы фактически вести требуемые наблюдения, я создам новую переменную KEEP, которая будет верна для записей, которые соответствуют вашим критериям.

data want ;
  recno+1;
  set have end=eof;
  lag_type=lag(type);
  if not eof then set have(firstobs=2 keep=type rename=(type=lead_type));
  else lead_type=.;
  keep= (type=1 or lag_type=1 or lead_type=1) ;
run;

Вот результат.

recno       datetime        type    lag_type lead_type    keep
  1      ddmmyy:10:30:00      0         .         0        0
  2      ddmmyy:10:31:00      0         0         1        1
  3      ddmmyy:10:32:00      1         0         0        1
  4      ddmmyy:10:33:00      0         1         1        1
  5      ddmmyy:10:34:00      1         0         0        1
  6      ddmmyy:10:35:00      0         1         .        1
0 голосов
/ 03 мая 2018

Набор данных X в другом посте - это та же исходная таблица, которую вы фильтруете, поэтому логический порядок кода:

  1. Проверить каждую строку в таблице «Есть», _N_ содержит номер текущей строки,
  2. Если Type = 1, то Set Have Point=_N_ переходит к строке _N_ в таблице «Have» и выводит эту строку в новую таблицу «want», затем переходит к следующей строке. _N_ может быть указателем на текущий, предыдущий или следующий ряд. (Два оператора IF обрабатывают случаи первой строки и последней строки; там, где нет Previous или нет Next)

Полный рабочий код:

data have;
length datetime $23.;
input datetime $ type ;
datalines;
ddmmyy:10:30:00  0
ddmmyy:10:31:00  0
ddmmyy:10:32:00  1
ddmmyy:10:33:00  0
ddmmyy:10:34:00  1
ddmmyy:10:35:00  0
;
run;

data want;
set have nobs=nobs;
if type = 1 then do;
  current = _N_;
  prev = current - 1;
  next = current + 1;

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

  set have point = current;
  output;

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

 proc sort data=want noduprecs;
      by _all_ ; Run;

Примечание. Я добавил дополнительный шаг proc sort для удаления повторяющихся строк.

Выход:

 datetime=ddmmyy:10:31:00 type=0
 datetime=ddmmyy:10:32:00 type=1
 datetime=ddmmyy:10:33:00 type=0
 datetime=ddmmyy:10:34:00 type=1
 datetime=ddmmyy:10:35:00 type=0
...