SAS保留值并分配给新变量

SAS retain value and assign to new variable

我有以下数据

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   

我需要根据先前记录(其中 SRC=1)的 XVAR 值为 SRC=2 的记录创建一个新变量 _XVAR

输出应该是这样的:

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;

您可以使用 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;

也可以通过将 XVAR 保存在一个新变量 (last_XVAR) 中,保留它并删除它(您不希望它出现在输出中)来完成。然后使用那个分配_XVAR。注意需要在IF后设置last_XVAR,否则_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;