Извлекайте данные построчно с помощью функции задержки - PullRequest
0 голосов
/ 08 марта 2019

Доброе утро.У меня есть этот набор данных:

Appendix | Change_Serial_Number| Status     | Duration | Mileage  | Service
20101234        0                   .            60       120000       Z
20101234        1                 Proposed       48       110000       Z
20101234        2                 Activated      24        90000       Z
20101234        3                 Proposed       60       120000       Z
20101234        4                 Proposed       50       160000       B
20101234        5                 Activated      36       110000       B

Каждая строка - это вариант, который может быть активирован или предложен только с первой строкой со статусом типа пустого или ранее активированной вариацией.Мне нужна эта таблица:

Appendix | Change_Serial_Number| Status     | Duration | Mileage  | Service |Duration_Prev| Mileage_prev |
20101234        0                   .            60       120000       Z        .
20101234        1                 Proposed       48       110000       Z        60              120000
20101234        2                 Activated      24        90000       Z        60              120000
20101234        3                 Proposed       60       120000       Z        24              90000
20101234        4                 Proposed       50       160000       B        24              90000
20101234        5                 Activated      36       110000       B        24              90000

Мне нужно сравнивать продолжительность, пробег и обслуживание каждого варианта с ранее активированным или с начальным условием, только если не активирован вариант.

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

Я использовал этот код:

proc sort data=db_rdg;
       by Appendix Change_Serial_Number descending Change_Serial_Number;
  run;

  data db_rdg2;
       set db_rdg;
  by Appendix;
  Duration_prev=lag(Duration);
  if first. Appendix then Durata_prev =.;
  run;

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

Надеюсь, я был достаточно ясен:)

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Функция lag() действительно полезна только для работы со значениями из определенного числа наблюдений ранее. В этом случае вы не знаете, являются ли значения, с которыми вы хотите работать, из предыдущего наблюдения или из пяти или шести предыдущих наблюдений, поэтому вместо использования lag() вы должны RETAIN дополнительные переменные и обновить их значения когда уместно:

data db_rdg2;
  retain duration_prev .;
  set db_rdg;
  by Appendix;
  if first.Appendix or status = 'Activated' then duration_prev = duration;
run;

Оператор RETAIN позволяет duration_prev сохранять свое значение при каждом новом наблюдении, считанном с входа, вместо сброса на пропущенное.

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000214163.htm

0 голосов
/ 08 марта 2019

Вместо использования LAG для извлечения duration из предыдущей строки вы захотите сохранить переменные отслеживания состояния активации (для продолжительности, пробега и серийного номера) в переменной, которая сохраняется и обновляется после явный вывод.

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

data have; input
Appendix   Change_Serial_Number   Status $     Duration  Mileage   Service $;
datalines;
20101234        0                   .            60       120000       Z
20101234        1                 Proposed       48       110000       Z
20101234        2                 Activated      24        90000       Z
20101234        3                 Proposed       60       120000       Z
20101234        4                 Proposed       50       160000       B
20101234        5                 Activated      36       110000       B
run;

* NOTE: _APA suffix means @ prior activate;

* version 1;
* implicit loop with by group processing means ;
* explicit first. test needed in order to reset the apa tracking variables;

data want;
  set have;
  by appendix;

  if first.appendix then do;
     length csn_apa dur_apa mil_apa 8;
     call missing(csn_apa, dur_apa, mil_apa);    
  end;

  output;

  if status in (' ' 'Activate') then do;
    csn_apa = change_serial_number;
    dur_apa = duration;
    mil_apa = mileage;
  end;

  retain csn_apa dur_apa mil_apa;
run;

* version 2;
* DOW version;
* explicit loop over group means first. handling not explicitly needed;
* implicit loop performs tracking variable resets;
* retain not needed because output and tracking variables modified;
* within current iteration of implicit loop;

data want2;
  do until (last.appendix);
    set have;
    by appendix;

    output;

    if status in (' ' 'Activate') then do;
      csn_apa = change_serial_number;
      dur_apa = duration;
      mil_apa = mileage;
    end;
  end;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...