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