Заполнение пропущенных значений для многих переменных из предыдущего наблюдения по группам в SAS - PullRequest
0 голосов
/ 13 сентября 2018

Мой набор данных выглядит так:

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 голосов
/ 20 сентября 2018

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

%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;
0 голосов
/ 13 сентября 2018

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

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