Заполнение пропущенных значений для многих переменных из предыдущего наблюдения по группам в 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;

Цените помощь! Спасибо!

0
0
371
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Оператор UPDATE может это сделать. Он предназначен для обработки транзакций с основным набором данных, поэтому, когда значение транзакции отсутствует, текущее значение из главной таблицы остается неизменным. Вы можете использовать свой единый набор данных как в качестве основных, так и в качестве данных транзакции, добавив опцию набора данных OBS=0. Обычно ожидается вывод только одного наблюдения для каждой группы BY, но если вы добавите оператор OUTPUT, он может вывести все наблюдения.

data want;
  set have(obs=0) have ;
  by id;
  output;
run;
Ответ принят как подходящий

Полный код работает! Спасибо

%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;

Другие вопросы по теме