使用SAS中的UPDATE语句按组继续进行最后一次观察

时间:2016-05-11 08:12:49

标签: sas

我有一个数据集,可以在多个时间点对患者及其诊断进行观察。用于诊断的虚拟变量的值有时会丢失。这是一个例子:

  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;

不幸的是,上面的代码并没有达到我想要的效果。如果在下一个观察中缺少该变量的值,它将虚拟变量的值转发到下一个观察,无论观察中是否存在任何其他变量。我只想在下一次观察中缺少所有虚拟值时继续使用值。

我有什么想法可以修改我的代码来实现这个目标吗?

2 个答案:

答案 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 .