我有一个数据集,可以在多个时间点对患者及其诊断进行观察。用于诊断的虚拟变量的值有时会丢失。这是一个例子:
data have ;
infile datalines dsd delimiter=' ';
input patient $ year $ K50 $ K51 $ K52 $ ;
datalines;
1 2010 . . .
1 2011 . 1 .
1 2012 . 1 1
1 2014 . . .
2 2009 1 . .
2 2010 . . .
2 2013 . 1 .
2 2015 . . .
;
run;
如果当前观察中缺少虚拟变量的值,我想在前一次观察中继续虚拟变量的值,前提是患者ID相同。为此,我尝试了以下代码:
data master_dt;
if 0 then set have;
if 1 then delete;
run;
data master_dt;
update master_dt have;
by patient;
output;
run;
不幸的是,上面的代码并没有达到我想要的效果。如果在下一个观察中缺少该变量的值,它将虚拟变量的值转发到下一个观察,无论观察中是否存在任何其他变量。我只想在下一次观察中缺少所有虚拟值时继续使用值。
我有什么想法可以修改我的代码来实现这个目标吗?
答案 0 :(得分:0)
数据集选项。您的数据集不需要创建0 obs的master。此外,您在数据中使用INFILE语句是不必要的,并导致问题。
data have ;
input patient $ year $ K50 $ K51 $ K52 $ ;
datalines;
1 2010 . . .
1 2011 . 1 .
1 2012 . 1 1
1 2014 . . .
2 2009 1 . .
2 2010 . . .
2 2013 . 1 .
2 2015 . . .
;
run;
proc print;
run;
data want;
if 0 then set have;
update have(obs=0 keep=patient) have(drop=year);
by patient;
set have(keep=year);
output;
run;
proc print;
run;
答案 1 :(得分:0)
因此,如果希望缺失值覆盖以前的值,则需要使它们具有._
的特殊缺失值。
data fix_missing ;
set have ;
array x k50-k52 ;
if 0 < N(of x(*)) < dim(x) then do _n_=1 to dim(x);
if x(_n_)=. then x(_n_)=._;
end;
run;
data want;
update have(obs=0) fix_missing;
by patient;
output;
run;
产生这个值列表:
1 2010 . . .
1 2011 . 1 .
1 2012 . 1 1
1 2014 . 1 1
2 2009 1 . .
2 2010 1 . .
2 2013 . 1 .
2 2015 . 1 .