SAS 刷题
quiz

要求很清楚,给 vs 增加三个 variables,对于每个 subject,其中 visit id 为 0 的 test,增加 flag 变量值为 Y,并取出当次 base visit 时 test 的值,作为后续每次 visit 的 baseline,以便计算 change from baseline。
数据集的基本情况如下,

厘清思路
其实,整体思路也很清楚,所以我先提供一种 code,有不同的 code,欢迎留言讨论,
data vs_bl;
length basefl $1. base base1 chg 8.;
drop base1;
do until(last.vstest);
set vs;
by subjid vstest;
if visid= 0 then do;
basefl= "Y";
base1= aval;
end;
else if visid>0 then do;
basefl= "";
base= base1;
end;
chg= aval-base;
output;
end;
run;
认真看过之前推文的小伙伴,应该一眼就看出来了,这又是 dow loop 的个人秀。对于这里的要求,dow 蛮适合的。
我们以 subjid、vstest 为 by 分类,取同一个 subject 每一项 test 的最后一次为 do until 的判定条件,后面的 code 虽然看上去很简单,但是我要特别提醒大家注意⚠️,一旦 visit id 为 0 的该行记录被处理后,basefl 和 base1 的值在这次 data step 迭代中,只能被覆盖更新,而不会被下一次 do loop 所重置为缺失值。这个东西,我们以前讲过,即 do loop 是在一次 data step 的 PDV 之中覆盖更新值的,一定要注意。
细节
SAS 中,除 macro、sql 等之外,基本上 data step 的根基和灵魂就是 PDV。正确且清晰地设想 PDV 中 SAS 所涉及到的操作,是掌握好 base SAS programming 的基础。一屋不扫,无以当扫地僧🧹
非常感谢你能看到这里,如果你觉得写得还不错的话,求转发求关注,我们下篇文章再见👨🏻💻

