折腾SAS数据集 -- “in=”选项…

来源:互联网 发布:老司机网络什么意思 编辑:程序博客网 时间:2024/06/05 10:27
原文地址:-- “in=”选项的妙用">折腾SAS数据集 -- “in=”选项的妙用作者:TaooooooooGe
   在利用SAS编程输出临床试验报表的时候,经常会遇到要求较高(复杂)的报表,这时与其想方设法操作输出过程,如report过程,不如操作数据步,将数据事先整理好后再用简单的输出过程输出。我们组的SAS高手--Jack大致是这样说的,但对于他的这句话,我在提交完Xalacom统计报表(draft)后,才有了更深的体会。
 
   为了得到一个符合规定表格形式的,并易于后期制作的数据集,我们经常需要对原始数据或者中间数据进行昏天黑地式的折腾。在折腾数据时,灵活运用一些编程技巧往往能起到事半功倍的效果,这次介绍的数据步的一个小选项“in=”就是其中之一。
 
    in=是一个数据步选项,常被用来生成一个临时性的逻辑型变量。所谓临时性,因为它只存在于当前数据步中,不会被带入新生成的数据集中。所谓逻辑型,因为它的取值只有0和1,1表示条件为真,0表示条件为伪。
 
   说到这儿,我敢肯定没用过这个选项的同学仍是云里雾里的。不要紧,俗话说的好:实践出真知。让我们先来看看下面的例子吧。
 
   假设一个班级里有20位同学,每位同学都有一个且只有一个编号用于识别。这与临床试验数据一样,每个病人都有一个识别号。这个编号得像跟屁虫一样,主人到哪儿它也跟到哪儿,让人一看到它就知道它的主人也到了。这19位同学有一个基本信息数据集(class),除了识别号(id)和姓名(name)外,还包括性别(sex)、年龄(age)、身高(height)和体重(weight)。再假设这个班级的10个同学参加了一项活动(形成数据集act01只包含参加这项活动的10个同学),7个同学参加了另一项活动(形成的数据集act02只包含参加这项活动的7个同学),这些同学可以时有的参加了两项活动,有的只参加了其中一项。现在要建立一个数据集,这个数据集除了包含同学的以上基本信息外,还要包含指示哪些同学两项活动都参加和哪些同学两项活动都没参加的信息。在解决这个问题时,我们可以看到“in=”选项的用法和意义。但是,在看程序之前,我建议同学们先用自己的所学尝试一下。
 
SAS程序:
/* 原始数据集的预处理--排序(proc sort过程) */
/* 并保证一个同学只有一个观测(nodupkey选项) */
proc sort data=class nodupkey;
   by id;
run;
proc sort data=act01;
   by id;
run;
proc sort data=act02;
   by id;
run;
 
/* 正式处理:
(1) 按照id横向合并三个原始数据集;
(2) 生成4个新变量,act01=1指示只参加了第一项活动,
                  act02=1指示只参加了第二项活动,
                 actboth=1指示两项活动都参加了,
                 actnone=1指示两项活动都没参加。
*/
data classact;
   merge class(in=a)act01(in=b) act02(in=c);
   by id;
   if a;
   act01=b;
   act02=c;
   actboth=(b and c);
   actnone=(not b and notc);
run;
 
   看到“in=”选项的简明效果了吧?三个要被合并的数据集后的in=a,in=b,in=c选择项分别生成三个(临时性的)逻辑变量a,b,c,由于条件为真,所以他们的取值均为1。之后,byid;指明要按id进行横向合并。语句ifa;表示只要a=1就输出至新数据集classact中,即保证数据集class中的观测全部输出。act01=b;表示生成新变量act01,其取值规则为:b=1时,act01=1,否则act01=0,这样看这个变量就可以知道谁参加第一项活动,谁没有。act02=c与act01=b相同。actboth=(bandc);生成新变量actboth,其取值规则为:当b和c都为真时,actboth=1,否则为0,这样看这个变量就可以知道哪些同学参加了全部2项活动。以此类推,actnone=(notb and not c);的意义就不用我说了吧?
   再提醒一句,由于a,b,c都是临时性变量,在新数据集classact中你将看不到它们的身影。真正的功成身退啊!
   刚才说过了,时间出真知。同学们不妨利用前面讲过的知识自己造这么三个原始数据集来试验一下吧。
0 0
原创粉丝点击