SAS保留价值并分配给新变量

时间:2018-06-13 07:30:11

标签: sas retain datastep

我有以下数据

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 = 2的记录创建一个新的变量_XVAR,基于前一记录的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 :(得分:1)

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

答案 1 :(得分:1)

也可以通过将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;