Заполнение пропущенных значений для многих переменных из предыдущего наблюдения по группам в 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 $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 ответа
Решение
Полный код работает! Спасибо
%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;
UPDATE
Заявление может сделать это. Он предназначен для обработки транзакций по основному набору данных, поэтому при отсутствии значения транзакции текущее значение из главной таблицы остается неизменным. Вы можете использовать свой единый набор данных в качестве основных данных и данных транзакции, добавив OBS=0
опция набора данных. Обычно он будет выдавать только одно наблюдение на группу BY, но если вы добавите OUTPUT
Заявление, что вы можете сделать вывод всех наблюдений.
data want;
set have(obs=0) have ;
by id;
output;
run;