我有以下数据
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;
答案 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;