在 SAS 中按组填充先前观察到的许多变量的缺失值
Filling missing values for many variables from previous observation by group in SAS
我的数据集如下所示:
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 .;
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;
感谢您的帮助!谢谢!
UPDATE
语句可以做到这一点。它旨在处理针对主数据集的交易,因此当交易值缺失时,主 table 中的当前值保持不变。通过添加 OBS=0
数据集选项,您可以将单个数据集用作主数据和交易数据。通常它会期望每个 BY 组只输出一个观察值,但是如果你添加一个 OUTPUT
语句你可以让它输出所有的观察值。
data want;
set have(obs=0) have ;
by id;
output;
run;
完整代码有效!谢谢
%macro a(variable);
length _&variable .;
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;
我的数据集如下所示:
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 .;
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;
感谢您的帮助!谢谢!
UPDATE
语句可以做到这一点。它旨在处理针对主数据集的交易,因此当交易值缺失时,主 table 中的当前值保持不变。通过添加 OBS=0
数据集选项,您可以将单个数据集用作主数据和交易数据。通常它会期望每个 BY 组只输出一个观察值,但是如果你添加一个 OUTPUT
语句你可以让它输出所有的观察值。
data want;
set have(obs=0) have ;
by id;
output;
run;
完整代码有效!谢谢
%macro a(variable);
length _&variable .;
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;