SAS сохраняет значение и присваивает новую переменную - PullRequest
0 голосов
/ 13 июня 2018

У меня есть следующие данные

EMPID   XVAR    SRC 
ABC     PER1    1   
ABC             2   
XYZ     PER1    1   
XYZ             2   
LMN     PER1    1   
LMN             2   
LMN     PER2    1   
LMN             2   
LMN             2   
LMN     PER3    1   
LMN             2   

Мне нужно создать новую переменную _XVAR для записей, где SRC = 2 на основе значения XVAR для предыдущей записи (где SRC = 1)

Вывод должен быть таким:

EMPID   XVAR    SRC  _XVAR
ABC     PER1    1     
ABC             2     PER1
XYZ     PER1    1   
XYZ             2     PER1
LMN     PER1    1   
LMN             2     PER1
LMN     PER2    1   
LMN             2     PER2
LMN             2     PER2
LMN     PER3    1   
LMN             2     PER3

Я пытаюсь следующее, но это не работает;

data t003;
set t003;
by EMPID;
retain XVAR;
if SRC eq 2 then _XVAR=XVAR;
run;

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Это также можно сделать, сохранив XVAR в новой переменной (last_XVAR), сохранив его и удалив его (вы не хотите, чтобы он выводился).Затем используйте его для назначения _XVAR.Обратите внимание, что вам нужно установить last_XVAR после IF или текущий XVAR, используемый в присваивании _XVAR.

Ваш код, отредактированный:

data t003;
    set t003;
    by EMPID;

    length _XVAR last_XVAR $ 10;

    if SRC eq 2 then _XVAR = last_XVAR;

    last_XVAR = XVAR;
    retain last_XVAR;
    drop last_XVAR;
run;
0 голосов
/ 13 июня 2018

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

Пример данных

data have; input
EMPID $ XVAR $  SRC; datalines;
ABC     PER1    1   
ABC     .       2   
XYZ     PER1    1   
XYZ     .       2   
LMN     PER1    1   
LMN     .       2   
LMN     PER2    1   
LMN     .       2   
LMN     .       2   
LMN     PER3    1   
LMN     .       2   
run;

Пример кода

data want;
  set have;

  lag_xvar = lag(xvar);

  if src eq 2 then do;
    if lag_xvar ne '' then _xvar = lag_xvar;
  end;
  else
    _xvar = ' ';

  retain _xvar;
  drop lag_xvar;
run;
...