【问题标题】:Using the UPDATE statement in SAS to carry forward the last observation by group使用 SAS 中的 UPDATE 语句按组进行最后一次观察
【发布时间】:2016-05-11 08:12:48
【问题描述】:

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

  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;

不幸的是,上面的代码并没有达到我想要的效果。如果虚拟变量的值在下一次观察中缺失,它会将虚拟变量的值转移到下一次观察中,而不管观察中是否存在任何其他变量。我只想在下一次观察中缺少所有虚拟值时结转值。

有什么想法可以修改我的代码来实现这一点吗?

【问题讨论】:

  • 您已将变量 year,k50-k52 分配为字符,这意味着将存储句点 (.) 而不是缺失值。这是故意的,还是应该是数字变量(我怀疑)
  • 你是对的;它们应该是数字。
  • 我不明白你想要什么。你能举一个例子,你想要的值与 UPDATE 会做的不同吗?例如,您希望倒数第二次观察的值是多少?
  • 如果您查看患者 2 的观察结果,更新语句会将 K50 列中的值 1 延续到该患者的所有后续观察结果。只要其他任何列(在本例中为 K51 和 K52)中没有值,我只想结转该值。这意味着患者 2 的观察值 1 和 2 在 K50 列中应为 1,而同一患者的观察值 3 和 4 在 K51 列中应为 1。使用我当前的代码,患者 2 的 obs 3 和 4 在 K50 列中有一个 1。

标签: sas


【解决方案1】:

数据集选项。不需要您的数据集来创建具有 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;

【讨论】:

    【解决方案2】:

    因此,如果希望缺失值覆盖以前的值,则需要使它们具有特殊的缺失值._

    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 .
    

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 2015-12-14
      • 2021-06-27
      • 2016-09-02
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多