欢迎光临散文网 会员登陆 & 注册

SAS 刷题

2021-09-10 22:19 作者:陆震同学  | 我要投稿

除了讲知识点以外,我们当然更多的要实战。今天来刷题了😀

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 之中覆盖更新值的,一定要注意。

因而,当我们不想在后续 visit 中让 basefl 为 Y 时,需要重新赋值 basefl。至于不为 0 的所有 visit 是怎么都取到 baseline 的 aval,如果你理解了上面这段话,应该就明白原因了,这也是上面 code 为什么要单独弄个 base1 出来保存基线的 aval。

细节

SAS 中,除 macro、sql 等之外,基本上 data step 的根基和灵魂就是 PDV。正确且清晰地设想 PDV 中 SAS 所涉及到的操作,是掌握好 base SAS programming 的基础。一屋不扫,无以当扫地僧🧹

非常感谢你能看到这里,如果你觉得写得还不错的话,求转发求关注,我们下篇文章再见👨🏻‍💻  


SAS 刷题的评论 (共 条)

分享到微博请遵守国家法律