在SAS中按组填充先前观察到的许多变量的缺失值

时间:2018-09-13 16:18:24

标签: arrays macros sas retain

我的数据集如下:

Date  ID Var1 Var2 ... Var5
200701 1  x    .    
200702 1  .    a
200703 1  .    .
200701 2  .    b 
200702 2  y    b
200703 2  y    .
200702 3  z    .
200703 3  .    .

我希望我的结果看起来像这样:

Date  ID Var1 Var2 ... Var5
200701 1  x    .
200702 1  x    a
200703 1  x    a
200701 2  .    b 
200702 2  y    b
200703 2  y    b
200702 3  z    .
200703 3  z    .

我在下面尝试了以下代码,但是没有用。它出什么问题了? 我最好使用数组吗?如果可以,怎么办?

%macro a(variable);
length _&variable $10.;
retain _&variable;
if first.ID then _&variable = '';
if &variable ne '' then _&variable=&variable;
else if &variable = '' then &variable=_&variable;
drop _&variable;
%mend;

data want;
set have;
%a(Var1)
%a(Var2)
%a(Var3)
%a(Var4)
%a(Var5)
run;

感谢帮助!谢谢!

2 个答案:

答案 0 :(得分:0)

UPDATE语句可以做到这一点。它旨在针对主数据集处理事务,因此当缺少事务值时,主表中的当前值将保持不变。通过添加OBS=0数据集选项,您可以将单个数据集用作主数据和交易数据。通常,每个BY组将只输出一个观察值,但是如果添加OUTPUT语句,则可以输出所有观察值。

data want;
  set have(obs=0) have ;
  by id;
  output;
run;

答案 1 :(得分:0)

完整代码有效!谢谢

%macro a(variable);
length _&variable $10.;
retain _&variable;
if first.ID then _&variable = '';
if &variable ne '' then _&variable=&variable;
else if &variable = '' then &variable=_&variable;
drop _&variable;
%mend;

data want;
update have(obs=0) have;
by id;
output;
%a(Var1)
%a(Var2)
%a(Var3)
%a(Var4)
%a(Var5)
run;