【发布时间】: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